From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32615 invoked by alias); 20 Jan 2003 14:16:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 32570 invoked by uid 71); 20 Jan 2003 14:16:01 -0000 Resent-Date: 20 Jan 2003 14:16:01 -0000 Resent-Message-ID: <20030120141601.32567.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, adam@os.inf.tu-dresden.de Received: (qmail 13965 invoked by uid 48); 20 Jan 2003 14:12:17 -0000 Message-Id: <20030120141217.13963.qmail@sources.redhat.com> Date: Mon, 20 Jan 2003 14:16:00 -0000 From: adam@os.inf.tu-dresden.de Reply-To: adam@os.inf.tu-dresden.de To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/9373: GCC-3.3 internal compiler error with -fstrict-aliasing X-SW-Source: 2003-01/txt/msg01116.txt.bz2 List-Id: >Number: 9373 >Category: c++ >Synopsis: GCC-3.3 internal compiler error with -fstrict-aliasing >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Mon Jan 20 14:16:01 UTC 2003 >Closed-Date: >Last-Modified: >Originator: Adam Lackorzynski >Release: gcc version 3.3 20030118 (prerelease) >Organization: >Environment: Linux 2.4.20 SMP, x86, Debian 3.0_r1/woody, gcc-snapshot_20030118-1_i386.deb >Description: When compiling the source with -fstrict-aliasing, the following ICE occurs: /usr/lib/gcc-snapshot/bin/g++ -c -Wall thread-log.ii -o z.o -fstrict-aliasing ../src/kern/ia32/thread-log.cpp: In static member function `static void Thread::hook_ipc_vector()': ../src/kern/ia32/thread-log.cpp:301: internal compiler error: in set_mem_alias_set, at emit-rtl.c:1932 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. Leaving -fstrict-aliasing out, it compiles. I also tried several previous versions from the 3.3 branch which gave the same errors. >How-To-Repeat: /usr/lib/gcc-snapshot/bin/g++ -c -Wall thread-log.ii -o z.o -fstrict-aliasing >Fix: Don't compile with -fstrict-aliasing or -O2 or higher. It works with gcc-3.2.2 and gcc-2.95.4. >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="thread-log.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="thread-log.ii" IyAxICJhdXRvL3RocmVhZC1sb2cuY2MiCiMgMSAiPGJ1aWx0LWluPiIKIyAxICI8Y29tbWFuZCBs aW5lPiIKIyAxICJhdXRvL3RocmVhZC1sb2cuY2MiCgoKIyAxICJhdXRvL3RocmVhZC5oIiAxCgoK CgoKIyAxICIuLi9zcmMvbGliL21pbmlsaWJjL2lhMzIvaW5jbHVkZS9zZXRqbXAuaCIgMQoKCgoj IDEgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2NkZWZzLmgiIDEKIyA1ICIuLi9zcmMvbGliL21p bmlsaWJjL2lhMzIvaW5jbHVkZS9zZXRqbXAuaCIgMgoKCgp0eXBlZGVmIGludCBfX2ptcF9idWZb Nl07CiMgMjEgIi4uL3NyYy9saWIvbWluaWxpYmMvaWEzMi9pbmNsdWRlL3NldGptcC5oIgp0eXBl ZGVmIHN0cnVjdCBfX2ptcF9idWZfdGFnCnsKCgoKICBfX2ptcF9idWYgX19qbXBidWY7Cn0gam1w X2J1ZlsxXTsKCmV4dGVybiAiQyIgewoKdm9pZCBsb25nam1wIChqbXBfYnVmIF9fZW52LCBpbnQg X192YWwpCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKaW50IHNldGptcChq bXBfYnVmIGVudik7Cgp9CiMgNyAiYXV0by90aHJlYWQuaCIgMgoKIyAxICJhdXRvL2w0X3R5cGVz LmgiIDEKCgoKCgojIDEgIi4uL3NyYy90eXBlcy90eXBlcy5oIiAxCiMgMTEgIi4uL3NyYy90eXBl cy90eXBlcy5oIgojIDEgIi91c3IvbGliL2djYy1zbmFwc2hvdC9saWIvZ2NjLWxpYi9pMzg2LWxp bnV4LzMuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxCiMgMTUxICIvdXNyL2xpYi9nY2Mtc25hcHNob3Qv bGliL2djYy1saWIvaTM4Ni1saW51eC8zLjMvaW5jbHVkZS9zdGRkZWYuaCIKdHlwZWRlZiBpbnQg cHRyZGlmZl90OwojIDIxMyAiL3Vzci9saWIvZ2NjLXNuYXBzaG90L2xpYi9nY2MtbGliL2kzODYt bGludXgvMy4zL2luY2x1ZGUvc3RkZGVmLmgiCnR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsK IyAxMiAiLi4vc3JjL3R5cGVzL3R5cGVzLmgiIDIKIyAxICIuLi9zcmMvdHlwZXMvaWEzMi90eXBl cy1hcmNoLmgiIDEKCgoKCgoKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVuc2lnbmVkODsKdHlwZWRl ZiBzaWduZWQgY2hhciBTaWduZWQ4Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVuc2lnbmVkMTY7 CnR5cGVkZWYgc2lnbmVkIHNob3J0IFNpZ25lZDE2Owp0eXBlZGVmIHVuc2lnbmVkIGludCBVbnNp Z25lZDMyOwp0eXBlZGVmIHNpZ25lZCBpbnQgU2lnbmVkMzI7CnR5cGVkZWYgdW5zaWduZWQgbG9u ZyBsb25nIGludCBVbnNpZ25lZDY0Owp0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50IFNpZ25l ZDY0OwoKCnR5cGVkZWYgU2lnbmVkMzIgU213b3JkOwp0eXBlZGVmIFVuc2lnbmVkMzIgTXdvcmQ7 CgoKCnR5cGVkZWYgVW5zaWduZWQzMiB2bV9vZmZzZXRfdDsKdHlwZWRlZiBVbnNpZ25lZDMyIEFk ZHJlc3M7CgoKdHlwZWRlZiBVbnNpZ25lZDMyIHZtX3NpemVfdDsKCnR5cGVkZWYgVW5zaWduZWQ2 NCBDcHVfdGltZTsKIyAxMyAiLi4vc3JjL3R5cGVzL3R5cGVzLmgiIDIKCgoKdHlwZWRlZiBzdHJ1 Y3QgeyBVbnNpZ25lZDMyIGxvdywgaGlnaDsgfSBsNF9sb3dfaGlnaF90OwoKCnR5cGVkZWYgc3Ry dWN0IHsgQWRkcmVzcyBsb3csIGhpZ2g7IH0gbDRfYWRkcl9yYW5nZV90OwoKCgp0eXBlZGVmIFNt d29yZCBzc2l6ZV90OwojIDcgImF1dG8vbDRfdHlwZXMuaCIgMgojIDY2ICJhdXRvL2w0X3R5cGVz LmgiCnR5cGVkZWYgc3RydWN0IHsKICBNd29yZCBtc2dfZGVjZWl0ZWQ6MTsKICBNd29yZCBmcGFn ZV9yZWNlaXZlZDoxOwogIE13b3JkIG1zZ19yZWRpcmVjdGVkOjE7CiAgTXdvcmQgc3JjX2luc2lk ZToxOwogIE13b3JkIHNuZF9lcnJvcjoxOwogIE13b3JkIGVycm9yX2NvZGU6MzsKICBNd29yZCBz dHJpbmdzOjU7CiAgTXdvcmQgZHdvcmRzOjE5Owp9IGw0X21zZ2RvcGVfc3RydWN0X3Q7CiMgOTEg ImF1dG8vbDRfdHlwZXMuaCIKY2xhc3MgTDRfZnBhZ2UKewpwdWJsaWM6CgogIEw0X2ZwYWdlKCBN d29yZCBncmFudCwgTXdvcmQgd3JpdGUsIE13b3JkIHNpemUsIE13b3JkIHBhZ2UgKTsKCiAgTXdv cmQgZ3JhbnQoKSBjb25zdDsKICB2b2lkIGdyYW50KCBNd29yZCApOwoKICBNd29yZCB3cml0ZSgp IGNvbnN0OwogIHZvaWQgd3JpdGUoIE13b3JkICk7CgogIE13b3JkIHNpemUoKSBjb25zdDsKICB2 b2lkIHNpemUoIE13b3JkICk7CgogIE13b3JkIHBhZ2UoKSBjb25zdDsKICB2b2lkIHBhZ2UoIE13 b3JkICk7CgogIE13b3JkIGlzX3dob2xlX3NwYWNlKCkgY29uc3Q7CiAgTXdvcmQgaXNfdmFsaWQo KSBjb25zdDsKCnByaXZhdGU6CgpwdWJsaWM6CiAgZW51bSB7CiAgICBXSE9MRV9TUEFDRSA9IDMy LAogIH07CgogIEw0X2ZwYWdlKCBNd29yZCB3ID0gMCApOwogIE13b3JkIHJhdygpIGNvbnN0OwoK cHJpdmF0ZToKCiAgTXdvcmQgX3JhdzsKCiAgZW51bSB7CiAgICBHUkFOVF9CSVQgPSAwLAogICAg V1JJVEVfQklUID0gMSwKICAgIFNJWkVfTUFTSyA9IDB4MDAwMDAwZmMsCiAgICBTSVpFX1NISUZU ID0gMiwKICAgIFNJWkVfU0laRSA9IDYsCiAgICBQQUdFX01BU0tfU1RVUElEX01BQ1JPX1dPUktB Uk9VTkQgPSAweGZmZmZmMDAwLAogICAgUEFHRV9TSElGVF9TVFVQSURfTUFDUk9fV09SS0FST1VO RCA9IDAsCiAgICBQQUdFX1NJWkVfU1RVUElEX01BQ1JPX1dPUktBUk9VTkQgPSAzMiwKICB9OwoK cHJpdmF0ZToKCnB1YmxpYzoKICBlbnVtIHsKICAgIFdIT0xFX0lPX1NQQUNFID0gMTYsCiAgICBJ T19QT1JUX01BWCA9IDFMIDw8IFdIT0xFX0lPX1NQQUNFLAogIH07CgogIE13b3JkIGlvcGFnZSgp IGNvbnN0OwogIHZvaWQgaW9wYWdlKCBNd29yZCApOwogIE13b3JkIGlzX2lvcGFnZSgpIGNvbnN0 OwogIE13b3JkIGlzX3dob2xlX2lvX3NwYWNlKCkgY29uc3Q7CgogIHN0YXRpYyBMNF9mcGFnZSBp byggTXdvcmQgcG9ydCwgTXdvcmQgc2l6ZSwgTXdvcmQgZ3JhbnQgKTsKCnByaXZhdGU6CiAgZW51 bSB7CiAgICBJT1BBR0VfTUFTSyA9IDB4MGZmZmYwMDAsCiAgICBJT1BBR0VfU0hJRlQgPSAxMiwK ICAgIElPSURfTUFTSyA9IDB4ZjAwMDAwMDAsCiAgICBJT19JRCA9IDB4ZjAwMDAwMDAsCiAgfTsK Cn07CgoKY2xhc3MgTDRfc25kX2Rlc2MKewpwdWJsaWM6CgogIEw0X3NuZF9kZXNjKCBNd29yZCB3 ID0gKE13b3JkKS0xICk7CgogIE13b3JkIGRlY2VpdGUoKSBjb25zdDsKICBNd29yZCBtYXAoKSBj b25zdDsKICB2b2lkICptc2coKSBjb25zdDsKCiAgTXdvcmQgaXNfbG9uZ19pcGMoKSBjb25zdDsK ICBNd29yZCBoYXNfc2VuZCgpIGNvbnN0OwoKcHJpdmF0ZToKICBNd29yZCBfZDsKfTsKCgpjbGFz cyBMNF9yY3ZfZGVzYwp7CnB1YmxpYzoKICBMNF9yY3ZfZGVzYyggTXdvcmQgdyA9IChNd29yZCkt MSApOwogIE13b3JkIG9wZW5fd2FpdCgpIGNvbnN0OwogIE13b3JkIHJtYXAoKSBjb25zdDsKICB2 b2lkICptc2coKSBjb25zdDsKICBMNF9mcGFnZSBmcGFnZSgpIGNvbnN0OwogIE13b3JkIGlzX3Jl Z2lzdGVyX2lwYygpIGNvbnN0OwogIE13b3JkIGhhc19yZWNlaXZlKCkgY29uc3Q7Cgpwcml2YXRl OgogIE13b3JkIF9kOwoKCnB1YmxpYzoKCiAgTXdvcmQgcmF3KCkgY29uc3Q7Cn07CgoKCgpjbGFz cyBMNF90aW1lb3V0CnsKcHJpdmF0ZToKICBlbnVtIHsKICAgIFJDVl9FWFBfTUFTSyA9IDB4MGYs CiAgICBSQ1ZfRVhQX1NISUZUID0gMCwKCiAgICBTTkRfRVhQX01BU0sgPSAweDBmMCwKICAgIFNO RF9FWFBfU0hJRlQgPSA0LAoKICAgIFJDVl9QRkFVTFRfTUFTSyA9IDB4MGYwMCwKICAgIFJDVl9Q RkFVTFRfU0hJRlQgPSA4LAoKICAgIFNORF9QRkFVTFRfTUFTSyA9IDB4MGYwMDAsCiAgICBTTkRf UEZBVUxUX1NISUZUID0gMTIsCgogICAgU05EX01BTl9NQVNLID0gMHgwZmYwMDAwLAogICAgU05E X01BTl9TSElGVCA9IDE2LAoKICAgIFJDVl9NQU5fTUFTSyA9IDB4MGZmMDAwMDAwLAogICAgUkNW X01BTl9TSElGVCA9IDI0LAogIH07CgpwdWJsaWM6CiAgZW51bSB7CiAgICBORVZFUiA9IDAsCiAg fTsKCiAgZXhwbGljaXQgTDRfdGltZW91dCggTXdvcmQgdCA9IDAgKTsKICBMNF90aW1lb3V0KCBN d29yZCBzbmRfbWFuLCBNd29yZCBzbmRfZXhwLCBNd29yZCByY3ZfbWFuLCBNd29yZCByY3ZfZXhw LCBNd29yZCBzbmRfcGZsdCwgTXdvcmQgcmN2X3BmbHQgKTsKCiAgTXdvcmQgcmN2X2V4cCgpIGNv bnN0OwogIHZvaWQgcmN2X2V4cCggTXdvcmQgKTsKICBNd29yZCBzbmRfZXhwKCkgY29uc3Q7CiAg dm9pZCBzbmRfZXhwKCBNd29yZCApOwogIE13b3JkIHJjdl9wZmF1bHQoKSBjb25zdDsKICB2b2lk IHJjdl9wZmF1bHQoIE13b3JkICk7CiAgTXdvcmQgc25kX3BmYXVsdCgpIGNvbnN0OwogIHZvaWQg c25kX3BmYXVsdCggTXdvcmQgKTsKICBNd29yZCByY3ZfbWFuKCkgY29uc3Q7CiAgdm9pZCByY3Zf bWFuKCBNd29yZCApOwogIE13b3JkIHNuZF9tYW4oKSBjb25zdDsKICB2b2lkIHNuZF9tYW4oIE13 b3JkICk7CgogIFVuc2lnbmVkNjQgcmN2X21pY3Jvc2VjcygpIGNvbnN0OwogIFVuc2lnbmVkNjQg c25kX21pY3Jvc2VjcygpIGNvbnN0OwoKcHJpdmF0ZToKICBNd29yZCBfdDsKCn07CiMgMjY1ICJh dXRvL2w0X3R5cGVzLmgiCmNsYXNzIEw0X3VpZAp7CnB1YmxpYzoKIyAyNzcgImF1dG8vbDRfdHlw ZXMuaCIKICBMNF91aWQoIHVuc2lnbmVkIHRhc2ssIHVuc2lnbmVkIGx0aHJlYWQgKTsKCgoKCgog IHVuc2lnbmVkIHZlcnNpb24oKSBjb25zdDsKCgogIHVuc2lnbmVkIGx0aHJlYWQoKSBjb25zdDsK CgogIHVuc2lnbmVkIHRhc2soKSBjb25zdDsKCgogIHVuc2lnbmVkIGd0aHJlYWQoKSBjb25zdDsK CgogIHVuc2lnbmVkIGNoaWVmKCkgY29uc3Q7CgoKICB2b2lkIHZlcnNpb24oIHVuc2lnbmVkICk7 CgoKICB2b2lkIGx0aHJlYWQoIHVuc2lnbmVkICk7CgoKICB2b2lkIHRhc2soIHVuc2lnbmVkICk7 CgoKICB2b2lkIGNoaWVmKCB1bnNpZ25lZCApOwoKCgoKCiAgTXdvcmQgaXNfbmlsKCkgY29uc3Q7 CgoKCgoKICBNd29yZCBpc19pbnZhbGlkKCkgY29uc3Q7CgoKICBMNF91aWQgdGFza19pZCgpIGNv bnN0OwoKCiAgc3RhdGljIEw0X3VpZCBpcnEoIHVuc2lnbmVkIGlycSApOwoKCiAgTXdvcmQgaXNf aXJxKCkgY29uc3Q7CgoKCgoKCiAgTXdvcmQgaXJxKCkgY29uc3Q7CgoKICBib29sIG9wZXJhdG9y ID09ICggTDRfdWlkIG8gKSBjb25zdDsKCgogIGJvb2wgb3BlcmF0b3IgIT0gKCBMNF91aWQgbyAp IGNvbnN0CiAgeyByZXR1cm4gISBvcGVyYXRvciA9PSAobyk7IH0KCgogIHN0YXRpYyB1bnNpZ25l ZCBjb25zdCB0aHJlYWRzX3Blcl90YXNrKCk7Cgpwcml2YXRlOgoKcHVibGljOgoKCiAgZW51bSB7 CiAgICBJTlZBTElEID0gMHgwZmZmZmZmZmYsCiAgICBOSUwgPSAweDAwMDAwMDAwMCwKICB9OwoK CiAgTDRfdWlkKCBVbnNpZ25lZDY0ID0gTklMICk7CgoKICBMNF91aWQoIHVuc2lnbmVkIHRhc2ss IHVuc2lnbmVkIGx0aHJlYWQsIHVuc2lnbmVkIHNpdGUsCiAgICAgICAgICB1bnNpZ25lZCBjaGll ZiwgdW5zaWduZWQgbmVzdCA9IDAsIHVuc2lnbmVkIHZlcnNpb24gPSAwICk7CgoKICB1bnNpZ25l ZCBzaXRlKCkgY29uc3Q7CgoKICB1bnNpZ25lZCBuZXN0KCkgY29uc3Q7CgoKICB2b2lkIHNpdGUo IHVuc2lnbmVkICk7CgoKICB2b2lkIG5lc3QoIHVuc2lnbmVkICk7CgoKICBVbnNpZ25lZDY0IHJh dygpIGNvbnN0OwoKcHJpdmF0ZToKICBlbnVtIHsKICAgIExPV19NQVNLID0gMHgwMDAwMDAwMGZm ZmZmZmZmTEwsCiAgICBWRVJTSU9OX0xPV19NQVNLID0gMHgwMDAwMDAwMDAwMDAwM2ZmTEwsCiAg ICBWRVJTSU9OX0xPV19TSElGVCA9IDAsCiAgICBWRVJTSU9OX0xPV19TSVpFID0gMTAsCiAgICBM VEhSRUFEX01BU0sgPSAweDAwMDAwMDAwMDAwMWZjMDBMTCwKICAgIExUSFJFQURfU0hJRlQgPSBW RVJTSU9OX0xPV19TSElGVCArIFZFUlNJT05fTE9XX1NJWkUsCiAgICBMVEhSRUFEX1NJWkUgPSA3 LAogICAgVEFTS19NQVNLID0gMHgwMDAwMDAwMDBmZmUwMDAwTEwsCiAgICBUQVNLX1NISUZUID0g TFRIUkVBRF9TSElGVCArIExUSFJFQURfU0laRSwKICAgIFRBU0tfU0laRSA9IDExLAogICAgVkVS U0lPTl9ISUdIX01BU0sgPSAweDAwMDAwMDAwZjAwMDAwMDBMTCwKICAgIFZFUlNJT05fSElHSF9T SElGVCA9IFRBU0tfU0hJRlQgKyBUQVNLX1NJWkUsCiAgICBWRVJTSU9OX0hJR0hfU0laRSA9IDQs CiAgICBTSVRFX01BU0sgPSAweDAwMDFmZmZmMDAwMDAwMDBMTCwKICAgIFNJVEVfU0hJRlQgPSBW RVJTSU9OX0hJR0hfU0hJRlQgKyBWRVJTSU9OX0hJR0hfU0laRSwKICAgIFNJVEVfU0laRSA9IDE3 LAogICAgQ0hJRUZfTUFTSyA9IDB4MGZmZTAwMDAwMDAwMDAwMExMLAogICAgQ0hJRUZfU0hJRlQg PSBTSVRFX1NISUZUICsgU0lURV9TSVpFLAogICAgQ0hJRUZfU0laRSA9IDExLAogICAgTkVTVF9N QVNLID0gMHhmMDAwMDAwMDAwMDAwMDAwTEwsCiAgICBORVNUX1NISUZUID0gQ0hJRUZfU0hJRlQg KyBDSElFRl9TSVpFLAogICAgTkVTVF9TSVpFID0gNCwKICB9OwoKICBVbnNpZ25lZDY0IF9yYXc7 Cgp9OwoKCgoKdHlwZWRlZiB1bmlvbiB7CiAgbDRfbXNnZG9wZV9zdHJ1Y3RfdCBtZDsKICBNd29y ZCBtc2dkb3BlOwogIE13b3JkIGFzX2ludDsKICBNd29yZCByYXc7Cn0gbDRfbXNnZG9wZV90OwoK CgoKCnR5cGVkZWYgc3RydWN0IHsKICBNd29yZCBzbmRfc2l6ZTsKICBNd29yZCBzbmRfc3RyOwog IE13b3JkIHJjdl9zaXplOwogIE13b3JkIHJjdl9zdHI7Cn0gbDRfc3RyZG9wZV90OwoKCgoKCnR5 cGVkZWYgdW5pb24gewogIHN0cnVjdCB7CiAgICBNd29yZCBkOjE7CiAgICBNd29yZCBtOjE7CiAg ICBNd29yZCBhZGRyOiAoMzIpIC0yOwogIH0gc2Q7CiAgTXdvcmQgYXNfaW50OwogIE13b3JkIHJh dzsKfSBsNF9zZW5kX2Rlc2NfdDsKCnR5cGVkZWYgdW5pb24gewogIHN0cnVjdCB7CiAgICBNd29y ZCBvOjE7CiAgICBNd29yZCBtOjE7CiAgICBNd29yZCBhZGRyOiAoMzIpIC0yOwogIH0gcmQ7CiAg TXdvcmQgYXNfaW50OwogIE13b3JkIHJhdzsKfSBsNF9yZWN2X2Rlc2NfdDsKCgoKCgoKdHlwZWRl ZiBzdHJ1Y3QgewogIE13b3JkIHByaW86ODsKICBNd29yZCBzbWFsbDo4OwogIE13b3JkIHplcm86 NDsKICBNd29yZCB0aW1lX2V4cDo0OwogIE13b3JkIHRpbWVfbWFuOjg7Cn0gbDRfc2NoZWRfcGFy YW1fc3RydWN0X3Q7Cgp0eXBlZGVmIHVuaW9uIHsKICBNd29yZCBzY2hlZF9wYXJhbTsKICBsNF9z Y2hlZF9wYXJhbV9zdHJ1Y3RfdCBzcDsKfSBsNF9zY2hlZF9wYXJhbV90OwojIDQ5OSAiYXV0by9s NF90eXBlcy5oIgppbnQgbDRfaXNfaW52YWxpZF9zY2hlZF9wYXJhbShsNF9zY2hlZF9wYXJhbV90 IHNwKTsKIyA1MDggImF1dG8vbDRfdHlwZXMuaCIKaW5saW5lIE13b3JkIEw0X2ZwYWdlOjppc192 YWxpZCgpIGNvbnN0CnsKICByZXR1cm4gX3JhdzsKfQoKCgppbmxpbmUgTDRfZnBhZ2U6Okw0X2Zw YWdlKCBNd29yZCByYXcgKQogIDogX3JhdyhyYXcpCnt9CgoKCmlubGluZSBMNF9mcGFnZTo6TDRf ZnBhZ2UoIE13b3JkIGdyYW50LCBNd29yZCB3cml0ZSwgTXdvcmQgc2l6ZSwgTXdvcmQgcGFnZSAp CiAgOiBfcmF3KCAoZ3JhbnQgPyAoMTw8R1JBTlRfQklUKSA6IDApCiAgICAgICAgICB8ICh3cml0 ZSA/ICgxPDxXUklURV9CSVQpIDogMCkKICAgICAgICAgIHwgKChzaXplIDw8IFNJWkVfU0hJRlQp ICYgU0laRV9NQVNLKQogICAgICAgICAgfCAoKHBhZ2UgPDwgUEFHRV9TSElGVF9TVFVQSURfTUFD Uk9fV09SS0FST1VORCkgJiBQQUdFX01BU0tfU1RVUElEX01BQ1JPX1dPUktBUk9VTkQpICkKe30K CgoKaW5saW5lIE13b3JkIEw0X2ZwYWdlOjpncmFudCgpIGNvbnN0CnsKICByZXR1cm4gX3JhdyAm ICgxPDxHUkFOVF9CSVQpOwp9CgoKCmlubGluZSBNd29yZCBMNF9mcGFnZTo6d3JpdGUoKSBjb25z dAp7CiAgcmV0dXJuIF9yYXcgJiAoMTw8V1JJVEVfQklUKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRf ZnBhZ2U6OnNpemUoKSBjb25zdAp7CiAgcmV0dXJuIChfcmF3ICYgU0laRV9NQVNLKSA+PiBTSVpF X1NISUZUOwp9CgoKCmlubGluZSBNd29yZCBMNF9mcGFnZTo6cGFnZSgpIGNvbnN0CnsKICByZXR1 cm4gKF9yYXcgJiBQQUdFX01BU0tfU1RVUElEX01BQ1JPX1dPUktBUk9VTkQpID4+IFBBR0VfU0hJ RlRfU1RVUElEX01BQ1JPX1dPUktBUk9VTkQ7Cn0KCgoKaW5saW5lIHZvaWQgTDRfZnBhZ2U6Omdy YW50KCBNd29yZCB3ICkKewogIGlmKHcpCiAgICBfcmF3IHw9ICgxPDxHUkFOVF9CSVQpOwogIGVs c2UKICAgIF9yYXcgJj0gfigxPDxHUkFOVF9CSVQpOwp9CgoKCmlubGluZSB2b2lkIEw0X2ZwYWdl Ojp3cml0ZSggTXdvcmQgdyApCnsKICBpZih3KQogICAgX3JhdyB8PSAoMTw8V1JJVEVfQklUKTsK ICBlbHNlCiAgICBfcmF3ICY9IH4oMTw8V1JJVEVfQklUKTsKfQoKCgppbmxpbmUgdm9pZCBMNF9m cGFnZTo6c2l6ZSggTXdvcmQgdyApCnsKICBfcmF3ID0gKF9yYXcgJiB+U0laRV9NQVNLKSB8ICgo dzw8U0laRV9TSElGVCkgJiBTSVpFX01BU0spOwp9CgoKCmlubGluZSB2b2lkIEw0X2ZwYWdlOjpw YWdlKCBNd29yZCB3ICkKewogIF9yYXcgPSAoX3JhdyAmIH5QQUdFX01BU0tfU1RVUElEX01BQ1JP X1dPUktBUk9VTkQpIHwgKCh3PDxQQUdFX1NISUZUX1NUVVBJRF9NQUNST19XT1JLQVJPVU5EKSAm IFBBR0VfTUFTS19TVFVQSURfTUFDUk9fV09SS0FST1VORCk7Cn0KCgoKaW5saW5lIE13b3JkIEw0 X2ZwYWdlOjpyYXcoKSBjb25zdAp7CiAgcmV0dXJuIF9yYXc7Cn0KCgoKaW5saW5lIE13b3JkIEw0 X2ZwYWdlOjppc193aG9sZV9zcGFjZSgpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgPj4gMikgPT0g MzI7Cn0KCgoKaW5saW5lIE13b3JkIEw0X2ZwYWdlOjppb3BhZ2UoKSBjb25zdAp7CiAgcmV0dXJu IChfcmF3ICYgSU9QQUdFX01BU0spID4+IElPUEFHRV9TSElGVDsKfQoKCgppbmxpbmUgdm9pZCBM NF9mcGFnZTo6aW9wYWdlKCBNd29yZCB3ICkKewogIF9yYXcgPSAoX3JhdyAmIH5JT1BBR0VfTUFT SykgfCAoKHcgPDwgSU9QQUdFX1NISUZUKSAmIElPUEFHRV9NQVNLKTsKfQoKCgppbmxpbmUgTXdv cmQgTDRfZnBhZ2U6OmlzX2lvcGFnZSgpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgJiBJT0lEX01B U0spID09IElPX0lEOwp9CgoKCmlubGluZSBMNF9mcGFnZSBMNF9mcGFnZTo6aW8oIE13b3JkIHBv cnQsIE13b3JkIHNpemUsIE13b3JkIGdyYW50ICkKewogIHJldHVybiBMNF9mcGFnZSggKGdyYW50 ID8gMSA6IDApCiAgICAgICAgICAgICAgICAgICB8ICgocG9ydCA8PCBJT1BBR0VfU0hJRlQpICYg SU9QQUdFX01BU0spCiAgICAgICAgICAgICAgICAgICB8ICgoc2l6ZSA8PCBTSVpFX1NISUZUKSAm IFNJWkVfTUFTSykKICAgICAgICAgICAgICAgICAgIHwgSU9fSUQgKTsKfQoKCgppbmxpbmUgTXdv cmQgTDRfZnBhZ2U6OmlzX3dob2xlX2lvX3NwYWNlKCkgY29uc3QKewogIHJldHVybiAoX3JhdyA+ PiAyKSA9PSBXSE9MRV9JT19TUEFDRTsKfQoKCgoKaW5saW5lIEw0X3NuZF9kZXNjOjpMNF9zbmRf ZGVzYyggTXdvcmQgdyApCiAgOiBfZCh3KQp7fQoKCgppbmxpbmUgTXdvcmQgTDRfc25kX2Rlc2M6 OmRlY2VpdGUoKSBjb25zdAp7CiAgcmV0dXJuIF9kICYgMTsKfQoKCgppbmxpbmUgTXdvcmQgTDRf c25kX2Rlc2M6Om1hcCgpIGNvbnN0CnsKICByZXR1cm4gX2QgJiAyOwp9CgoKCmlubGluZSBNd29y ZCBMNF9zbmRfZGVzYzo6aXNfbG9uZ19pcGMoKSBjb25zdAp7CiAgcmV0dXJuIF9kICYgfjE7Cn0K CgoKaW5saW5lIE13b3JkIEw0X3NuZF9kZXNjOjpoYXNfc2VuZCgpIGNvbnN0CnsKICByZXR1cm4g X2QgIT0gKE13b3JkKS0xOwp9CgoKCmlubGluZSB2b2lkICpMNF9zbmRfZGVzYzo6bXNnKCkgY29u c3QKewogIHJldHVybiAodm9pZCopKF9kICYgfjMpOwp9CgoKCgppbmxpbmUgTXdvcmQgTDRfcmN2 X2Rlc2M6OnJhdygpIGNvbnN0CnsKICByZXR1cm4gX2Q7Cn0KCgoKaW5saW5lIEw0X3Jjdl9kZXNj OjpMNF9yY3ZfZGVzYyggTXdvcmQgdykKICA6IF9kKHcpCnt9CgoKCmlubGluZSBNd29yZCBMNF9y Y3ZfZGVzYzo6b3Blbl93YWl0KCkgY29uc3QKewogIHJldHVybiBfZCAmIDE7Cn0KCgoKaW5saW5l IE13b3JkIEw0X3Jjdl9kZXNjOjpybWFwKCkgY29uc3QKewogIHJldHVybiBfZCAmIDI7Cn0KCgoK aW5saW5lIHZvaWQgKkw0X3Jjdl9kZXNjOjptc2coKSBjb25zdAp7CiAgcmV0dXJuICh2b2lkKiko X2QgJiB+Myk7Cn0KCgoKaW5saW5lIEw0X2ZwYWdlIEw0X3Jjdl9kZXNjOjpmcGFnZSgpIGNvbnN0 CnsKICByZXR1cm4gTDRfZnBhZ2UoIF9kICYgfjMgKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfcmN2 X2Rlc2M6OmlzX3JlZ2lzdGVyX2lwYygpIGNvbnN0CnsKICByZXR1cm4gKF9kICYgfjEpID09IDA7 Cn0KCgoKaW5saW5lIE13b3JkIEw0X3Jjdl9kZXNjOjpoYXNfcmVjZWl2ZSgpIGNvbnN0CnsKICBy ZXR1cm4gX2QgIT0gKE13b3JkKS0xOwp9CgoKCmlubGluZSBMNF90aW1lb3V0OjpMNF90aW1lb3V0 KCBNd29yZCB0ICkKICA6IF90KHQpCnt9CgoKCmlubGluZSBMNF90aW1lb3V0OjpMNF90aW1lb3V0 KCBNd29yZCBzbmRfbWFuLCBNd29yZCBzbmRfZXhwLAogICAgICAgICAgICAgICAgICAgICAgICBN d29yZCByY3ZfbWFuLCBNd29yZCByY3ZfZXhwLAogICAgICAgICAgICAgICAgICAgICAgICBNd29y ZCBzbmRfcGZsdCwgTXdvcmQgcmN2X3BmbHQgKQogIDogX3QoICgoc25kX21hbiA8PCBTTkRfTUFO X1NISUZUKSAmIFNORF9NQU5fTUFTSykgfAogICAgICAgICgoc25kX2V4cCA8PCBTTkRfRVhQX1NI SUZUKSAmIFNORF9FWFBfTUFTSykgfAogICAgICAgICgocmN2X21hbiA8PCBSQ1ZfTUFOX1NISUZU KSAmIFJDVl9NQU5fTUFTSykgfAogICAgICAgICgocmN2X2V4cCA8PCBSQ1ZfRVhQX1NISUZUKSAm IFJDVl9FWFBfTUFTSykgfAogICAgICAgICgocmN2X3BmbHQgPDwgUkNWX1BGQVVMVF9TSElGVCkg JiBSQ1ZfUEZBVUxUX01BU0spIHwKICAgICAgICAoKHNuZF9wZmx0IDw8IFNORF9QRkFVTFRfU0hJ RlQpICYgU05EX1BGQVVMVF9NQVNLKSApCnt9CgoKCmlubGluZSBNd29yZCBMNF90aW1lb3V0Ojpy Y3ZfZXhwKCkgY29uc3QKewogIHJldHVybiAoX3QgJiBSQ1ZfRVhQX01BU0spID4+IFJDVl9FWFBf U0hJRlQ7Cn0KCgoKaW5saW5lIHZvaWQgTDRfdGltZW91dDo6cmN2X2V4cCggTXdvcmQgdyApCnsK ICBfdCA9IChfdCAmIH5SQ1ZfRVhQX01BU0spIHwgKCh3IDw8IFJDVl9FWFBfU0hJRlQpICYgUkNW X0VYUF9NQVNLKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfdGltZW91dDo6c25kX2V4cCgpIGNvbnN0 CnsKICByZXR1cm4gKF90ICYgU05EX0VYUF9NQVNLKSA+PiBTTkRfRVhQX1NISUZUOwp9CgoKCmlu bGluZSB2b2lkIEw0X3RpbWVvdXQ6OnNuZF9leHAoIE13b3JkIHcgKQp7CiAgX3QgPSAoX3QgJiB+ U05EX0VYUF9NQVNLKSB8ICgodyA8PCBTTkRfRVhQX1NISUZUKSAmIFNORF9FWFBfTUFTSyk7Cn0K CgoKaW5saW5lIE13b3JkIEw0X3RpbWVvdXQ6OnJjdl9wZmF1bHQoKSBjb25zdAp7CiAgcmV0dXJu IChfdCAmIFJDVl9QRkFVTFRfTUFTSykgPj4gUkNWX1BGQVVMVF9TSElGVDsKfQoKCgppbmxpbmUg dm9pZCBMNF90aW1lb3V0OjpyY3ZfcGZhdWx0KCBNd29yZCB3ICkKewogIF90ID0gKF90ICYgflJD Vl9QRkFVTFRfTUFTSykgfCAoKHcgPDwgUkNWX1BGQVVMVF9TSElGVCkgJiBSQ1ZfUEZBVUxUX01B U0spOwp9CgoKCmlubGluZSBNd29yZCBMNF90aW1lb3V0OjpzbmRfcGZhdWx0KCkgY29uc3QKewog IHJldHVybiAoX3QgJiBTTkRfUEZBVUxUX01BU0spID4+IFNORF9QRkFVTFRfU0hJRlQ7Cn0KCgoK aW5saW5lIHZvaWQgTDRfdGltZW91dDo6c25kX3BmYXVsdCggTXdvcmQgdyApCnsKICBfdCA9IChf dCAmIH5TTkRfUEZBVUxUX01BU0spIHwgKCh3IDw8IFNORF9QRkFVTFRfU0hJRlQpICYgU05EX1BG QVVMVF9NQVNLKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfdGltZW91dDo6cmN2X21hbigpIGNvbnN0 CnsKICByZXR1cm4gKF90ICYgUkNWX01BTl9NQVNLKSA+PiBSQ1ZfTUFOX1NISUZUOwp9CgoKCmlu bGluZSB2b2lkIEw0X3RpbWVvdXQ6OnJjdl9tYW4oIE13b3JkIHcgKQp7CiAgX3QgPSAoX3QgJiB+ UkNWX01BTl9NQVNLKSB8ICgodyA8PCBSQ1ZfTUFOX1NISUZUKSAmIFJDVl9NQU5fTUFTSyk7Cn0K CgoKaW5saW5lIE13b3JkIEw0X3RpbWVvdXQ6OnNuZF9tYW4oKSBjb25zdAp7CiAgcmV0dXJuIChf dCAmIFNORF9NQU5fTUFTSykgPj4gU05EX01BTl9TSElGVDsKfQoKCgppbmxpbmUgdm9pZCBMNF90 aW1lb3V0OjpzbmRfbWFuKCBNd29yZCB3ICkKewogIF90ID0gKF90ICYgflNORF9NQU5fTUFTSykg fCAoKHcgPDwgU05EX01BTl9TSElGVCkgJiBTTkRfTUFOX01BU0spOwp9CgoKCmlubGluZSBVbnNp Z25lZDY0IEw0X3RpbWVvdXQ6OnJjdl9taWNyb3NlY3MoKSBjb25zdAp7CiAgcmV0dXJuIChVbnNp Z25lZDY0KShyY3ZfbWFuKCkpIDw8ICgoMTUgLSByY3ZfZXhwKCkpIDw8IDEpOwp9CgoKCmlubGlu ZSBVbnNpZ25lZDY0IEw0X3RpbWVvdXQ6OnNuZF9taWNyb3NlY3MoKSBjb25zdAp7CiAgcmV0dXJu IChVbnNpZ25lZDY0KShzbmRfbWFuKCkpIDw8ICgoMTUgLSBzbmRfZXhwKCkpIDw8IDEpOwp9CgoK CmlubGluZSB1bnNpZ25lZCBjb25zdCBMNF91aWQ6OnRocmVhZHNfcGVyX3Rhc2soKQp7CiAgcmV0 dXJuIDE8PExUSFJFQURfU0laRTsKfQoKCgppbmxpbmUgYm9vbCBMNF91aWQ6Om9wZXJhdG9yID09 ICggTDRfdWlkIG8gKSBjb25zdAp7CiAgcmV0dXJuIG8uX3JhdyA9PSBfcmF3Owp9CgoKCmlubGlu ZSBMNF91aWQ6Okw0X3VpZCggVW5zaWduZWQ2NCB3ICkKICA6IF9yYXcodykKe30KCgoKaW5saW5l IEw0X3VpZDo6TDRfdWlkKCB1bnNpZ25lZCB0YXNrLCB1bnNpZ25lZCBsdGhyZWFkICkKICA6IF9y YXcoICgoKFVuc2lnbmVkNjQpdGFzayA8PCBUQVNLX1NISUZUKSAmIFRBU0tfTUFTSykKICAgICAg ICAgIHwgKCgoVW5zaWduZWQ2NClsdGhyZWFkIDw8IExUSFJFQURfU0hJRlQpICYgTFRIUkVBRF9N QVNLKSkKe30KCgoKaW5saW5lIEw0X3VpZDo6TDRfdWlkKCB1bnNpZ25lZCB0YXNrLCB1bnNpZ25l ZCBsdGhyZWFkLCB1bnNpZ25lZCBzaXRlLAogICAgICAgICAgICAgICAgdW5zaWduZWQgY2hpZWYs IHVuc2lnbmVkIG5lc3QsIHVuc2lnbmVkIHZlcnNpb24gKQogIDogX3JhdyggKCgoVW5zaWduZWQ2 NCl0YXNrIDw8IFRBU0tfU0hJRlQpICYgVEFTS19NQVNLKQogICAgICAgICAgfCAoKChVbnNpZ25l ZDY0KWx0aHJlYWQgPDwgTFRIUkVBRF9TSElGVCkgJiBMVEhSRUFEX01BU0spCiAgICAgICAgICB8 ICgoKFVuc2lnbmVkNjQpc2l0ZSA8PCBTSVRFX1NISUZUKSAmIFNJVEVfTUFTSykKICAgICAgICAg IHwgKCgoVW5zaWduZWQ2NCljaGllZiA8PCBDSElFRl9TSElGVCkgJiBDSElFRl9NQVNLKQogICAg ICAgICAgfCAoKChVbnNpZ25lZDY0KW5lc3QgPDwgTkVTVF9TSElGVCkgJiBORVNUX01BU0spCiAg ICAgICAgICB8ICgoKFVuc2lnbmVkNjQpdmVyc2lvbiA8PCBWRVJTSU9OX0xPV19TSElGVCkgJiBW RVJTSU9OX0xPV19NQVNLKQogICAgICAgICAgfCAoKChVbnNpZ25lZDY0KXZlcnNpb24gPDwgVkVS U0lPTl9ISUdIX1NISUZUKSAmIFZFUlNJT05fSElHSF9NQVNLKSApCnt9CgoKCmlubGluZSB1bnNp Z25lZCBMNF91aWQ6OnZlcnNpb24oKSBjb25zdAp7CiAgcmV0dXJuICgoX3JhdyAmIFZFUlNJT05f SElHSF9NQVNLKSA+PiBWRVJTSU9OX0hJR0hfU0hJRlQpCiAgICB8ICgoX3JhdyAmIFZFUlNJT05f TE9XX01BU0spID4+IFZFUlNJT05fTE9XX1NISUZUKTsKfQoKCgppbmxpbmUgdW5zaWduZWQgTDRf dWlkOjpsdGhyZWFkKCkgY29uc3QKewogIHJldHVybiAoX3JhdyAmIExUSFJFQURfTUFTSykgPj4g TFRIUkVBRF9TSElGVDsKfQoKCgppbmxpbmUgdW5zaWduZWQgTDRfdWlkOjp0YXNrKCkgY29uc3QK ewogIHJldHVybiAoX3JhdyAmIFRBU0tfTUFTSykgPj4gVEFTS19TSElGVDsKfQoKCgppbmxpbmUg dW5zaWduZWQgTDRfdWlkOjpndGhyZWFkKCkgY29uc3QKewogIHJldHVybiAoKF9yYXcgJiBMVEhS RUFEX01BU0spID4+IExUSFJFQURfU0hJRlQpIHwKICAgICgoX3JhdyAmIFRBU0tfTUFTSykgPj4g KFRBU0tfU0hJRlQgLSBMVEhSRUFEX1NJWkUpKTsKfQoKCgppbmxpbmUgdW5zaWduZWQgTDRfdWlk OjpzaXRlKCkgY29uc3QKewogIHJldHVybiAoX3JhdyAmIFNJVEVfTUFTSykgPj4gU0lURV9TSElG VDsKfQoKCgppbmxpbmUgdW5zaWduZWQgTDRfdWlkOjpjaGllZigpIGNvbnN0CnsKICByZXR1cm4g KF9yYXcgJiBDSElFRl9NQVNLKSA+PiBDSElFRl9TSElGVDsKfQoKCgppbmxpbmUgdW5zaWduZWQg TDRfdWlkOjpuZXN0KCkgY29uc3QKewogIHJldHVybiAoX3JhdyAmIE5FU1RfTUFTSykgPj4gTkVT VF9TSElGVDsKfQoKCgppbmxpbmUgdm9pZCBMNF91aWQ6OnZlcnNpb24oIHVuc2lnbmVkIHcgKQp7 CiAgX3JhdyA9IChfcmF3ICYgfihWRVJTSU9OX0xPV19NQVNLIHwgVkVSU0lPTl9ISUdIX01BU0sp KQogICAgfCAoKChVbnNpZ25lZDY0KXcgPDwgVkVSU0lPTl9MT1dfU0hJRlQpICYgVkVSU0lPTl9M T1dfTUFTSykKICAgIHwgKCgoVW5zaWduZWQ2NCl3IDw8IFZFUlNJT05fSElHSF9TSElGVCkgJiBW RVJTSU9OX0hJR0hfTUFTSyk7Cn0KCgoKaW5saW5lIHZvaWQgTDRfdWlkOjpsdGhyZWFkKCB1bnNp Z25lZCB3ICkKewogIF9yYXcgPSAoX3JhdyAmIH5MVEhSRUFEX01BU0spIHwgKCgoVW5zaWduZWQ2 NCl3IDw8IExUSFJFQURfU0hJRlQpICYgTFRIUkVBRF9NQVNLKTsKfQoKCgppbmxpbmUgdm9pZCBM NF91aWQ6OnRhc2soIHVuc2lnbmVkIHcgKQp7CiAgX3JhdyA9IChfcmF3ICYgflRBU0tfTUFTSykg fCAoKChVbnNpZ25lZDY0KXcgPDwgVEFTS19TSElGVCkgJiBUQVNLX01BU0spOwp9CgoKCmlubGlu ZSB2b2lkIEw0X3VpZDo6c2l0ZSggdW5zaWduZWQgdyApCnsKICBfcmF3ID0gKF9yYXcgJiB+U0lU RV9NQVNLKSB8ICgoKFVuc2lnbmVkNjQpdyA8PCBTSVRFX1NISUZUKSAmIFNJVEVfTUFTSyk7Cn0K CgoKaW5saW5lIHZvaWQgTDRfdWlkOjpjaGllZiggdW5zaWduZWQgdyApCnsKICBfcmF3ID0gKF9y YXcgJiB+Q0hJRUZfTUFTSykgfCAoKChVbnNpZ25lZDY0KXcgPDwgQ0hJRUZfU0hJRlQpICYgQ0hJ RUZfTUFTSyk7Cn0KCgoKaW5saW5lIHZvaWQgTDRfdWlkOjpuZXN0KCB1bnNpZ25lZCB3ICkKewog IF9yYXcgPSAoX3JhdyAmIH5ORVNUX01BU0spIHwgKCgoVW5zaWduZWQ2NCl3IDw8IE5FU1RfU0hJ RlQpICYgTkVTVF9NQVNLKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfdWlkOjppc19uaWwoKSBjb25z dAp7CiAgcmV0dXJuIChfcmF3ICYgTE9XX01BU0spID09IDA7Cn0KCgoKaW5saW5lIE13b3JkIEw0 X3VpZDo6aXNfaW52YWxpZCgpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgJiBMT1dfTUFTSykgPT0g SU5WQUxJRDsKfQoKCgppbmxpbmUgTDRfdWlkIEw0X3VpZDo6dGFza19pZCgpIGNvbnN0CnsKICBy ZXR1cm4gTDRfdWlkKCBfcmF3ICYgfkxUSFJFQURfTUFTSyApOwp9CgoKCmlubGluZSBMNF91aWQg TDRfdWlkOjppcnEoIHVuc2lnbmVkIGlycSApCnsKICByZXR1cm4gTDRfdWlkKCAoaXJxICsgMSkg JiB+TE9XX01BU0sgKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfdWlkOjppc19pcnEoKSBjb25zdAp7 CiAgcmV0dXJuIChfcmF3ICYgfkxPV19NQVNLKSA9PSAwICYmIF9yYXc7Cn0KCgoKaW5saW5lIE13 b3JkIEw0X3VpZDo6aXJxKCkgY29uc3QKewogIHJldHVybiBfcmF3LTE7Cn0KCgoKaW5saW5lIFVu c2lnbmVkNjQgTDRfdWlkOjpyYXcoKSBjb25zdAp7CiAgcmV0dXJuIF9yYXc7Cn0KIyAxMDYzICJh dXRvL2w0X3R5cGVzLmgiCmlubGluZSBpbnQgbDRfaXNfaW52YWxpZF9zY2hlZF9wYXJhbShsNF9z Y2hlZF9wYXJhbV90IHNwKQp7CiAgcmV0dXJuIHNwLnNjaGVkX3BhcmFtID09IDB4ZmZmZmZmZmY7 Cn0KIyA5ICJhdXRvL3RocmVhZC5oIiAyCgojIDEgImF1dG8vY29uZmlnLmgiIDEKCgoKCgojIDEg Imdsb2JhbGNvbmZpZy5oIiAxCiMgNyAiYXV0by9jb25maWcuaCIgMgoKCiMgMSAiLi4vc3JjL2tl cm4vY29uZmlnX3RjYnNpemUuaCIgMQojIDEwICJhdXRvL2NvbmZpZy5oIiAyCiMgNDYgImF1dG8v Y29uZmlnLmgiCmNsYXNzIENvbmZpZwp7CnB1YmxpYzoKICBlbnVtIHsKICAgIE1BWF9OVU1fSVJR ID0gMjAsCiAgICBTRVJJQUxfRVNDX0lSUSA9IDIsCiAgICBTRVJJQUxfRVNDX05PSVJRID0gMSwK ICAgIFNFUklBTF9OT19FU0MgPSAwLAogIH07CgoKICBzdGF0aWMgY29uc3QgdW5zaWduZWQga2Vy bmVsX3ZlcnNpb25faWQgPSAweDAxMDA0NDQ0OwojIDY3ICJhdXRvL2NvbmZpZy5oIgogIHN0YXRp YyBjb25zdCB1bnNpZ25lZCBrZXJuZWxfbWVtX3Blcl9jZW50ID0gMTA7CgogIHN0YXRpYyBjb25z dCB1bnNpZ25lZCB0aHJlYWRfYmxvY2tfc2l6ZSA9ICgweDgwMCk7CgogIHN0YXRpYyBjb25zdCB1 bnNpZ25lZCB0aHJlYWRfYmxvY2tfbWFzawogICAgPSAodGhyZWFkX2Jsb2NrX3NpemUgLSAxKSB8 IH4oKHRocmVhZF9ibG9ja19zaXplIDw8ICgxMSs3KSkgLSAxKTsKICBzdGF0aWMgY29uc3QgdW5z aWduZWQgdGhyZWFkX2Jsb2NrX2lkX2ZhY3RvciA9IHRocmVhZF9ibG9ja19zaXplLzB4NDAwOwoK ICBzdGF0aWMgY29uc3QgYm9vbCBjb25zZXJ2YXRpdmUgPSBmYWxzZTsKICBzdGF0aWMgY29uc3Qg Ym9vbCBtb25pdG9yX3BhZ2VfZmF1bHRzID0gY29uc2VydmF0aXZlOwoKCgoKICBzdGF0aWMgY29u c3QgYm9vbCBkZWNlaXRfYml0X2Rpc2FibGVzX3N3aXRjaCA9IGZhbHNlOwoKICBzdGF0aWMgY29u c3QgYm9vbCBmaW5lX2dyYWluZWRfY3B1dGltZSA9IGZhbHNlOwoKICBzdGF0aWMgYm9vbCBpcnFf YWNrX2luX2tlcm5lbDsKCiAgc3RhdGljIGJvb2wgZXNjX2hhY2s7CiAgc3RhdGljIGludCBzZXJp YWxfZXNjOwogIHN0YXRpYyBib29sIHdhdGNoZG9nOwogIHN0YXRpYyBib29sIGFwaWM7CgogIHN0 YXRpYyB1bnNpZ25lZCB0YnVmX2VudHJpZXM7CgoKCgogIHN0YXRpYyBjb25zdCBib29sIHByb2Zp bGluZyA9IGZhbHNlOwoKICBzdGF0aWMgY29uc3QgaW50IHByb2ZpbGluZ19yYXRlID0gMTAwOwog IHN0YXRpYyBjb25zdCBpbnQgcHJvZmlsZV9pcnEgPSAwOwoKCiAgc3RhdGljIGNvbnN0IHVuc2ln bmVkIGtlcm5lbF90YXNrbm8gPSAwOwogIHN0YXRpYyBjb25zdCBMNF91aWQga2VybmVsX2lkOwog IHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXJuZWxfcHJpbyA9IDE7CiAgc3RhdGljIGNvbnN0IHVu c2lnbmVkIGtlcm5lbF9tY3AgPSAyNTU7CgoKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2lnbWEw X3Rhc2tubyA9IDI7CiAgc3RhdGljIGNvbnN0IEw0X3VpZCBzaWdtYTBfaWQ7CiAgc3RhdGljIGNv bnN0IHVuc2lnbmVkIHNpZ21hMF9wcmlvID0gMHgxMDsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQg c2lnbWEwX21jcCA9IDA7CgoKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgYm9vdF90YXNrbm8gPSA0 OwogIHN0YXRpYyBjb25zdCBMNF91aWQgYm9vdF9pZDsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQg Ym9vdF9wcmlvID0gMHgxMDsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgYm9vdF9tY3AgPSAyNTU7 CgoKICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRfdGltZV9zbGljZSA9IDEwOwoKCnByaXZhdGU6 CgpwdWJsaWM6CgogIGVudW0gewogICAgVEJVRl9JUlEgPSAxNiwKICB9OwoKICBzdGF0aWMgY29u c3QgY2hhciAqY29uc3Qga2VybmVsX3ZlcnNpb25fc3RyaW5nOwoKICBlbnVtIHsKICAgIFBBR0Vf U0hJRlQgPSAxMiwKICAgIFBBR0VfU0laRSA9IDEgPDwgUEFHRV9TSElGVCwKICAgIFBBR0VfTUFT SyA9IH4oIFBBR0VfU0laRSAtIDEpLAoKICAgIFNVUEVSUEFHRV9TSElGVCA9IDIyLAogICAgU1VQ RVJQQUdFX1NJWkUgPSAxIDw8IFNVUEVSUEFHRV9TSElGVCwKICAgIFNVUEVSUEFHRV9NQVNLID0g figgU1VQRVJQQUdFX1NJWkUgLTEgKSwKCiAgfTsKCiAgc3RhdGljIGNvbnN0IGJvb2wgYmFja3dh cmRfY29tcGF0aWJpbGl0eSA9IHRydWU7CgoKCgogIHN0YXRpYyBjb25zdCBib29sIHNjaGVkdWxp bmdfdXNpbmdfcGl0ID0gZmFsc2U7CgoKCiAgc3RhdGljIGNvbnN0IGJvb2wgaGx0X3dvcmtzX29r ID0gdHJ1ZTsKCiAgc3RhdGljIGNvbnN0IGJvb2wgZ2V0Y2hhcl9kb2VzX2hsdCA9IHRydWU7CgoK CiAgc3RhdGljIGNvbnN0IGJvb2wgcGljX3ByaW9fbW9kaWZ5ID0gdHJ1ZTsKCgoKCgoKICBzdGF0 aWMgY29uc3QgYm9vbCBlbmFibGVfaW9fcHJvdGVjdGlvbiA9IGZhbHNlOwoKCgoKCgoKICBzdGF0 aWMgY29uc3QgdW5zaWduZWQgbWljcm9zZWNfcGVyX3RpY2sgPSA5NzZMTDsKCgoKCiAgc3RhdGlj IHVuc2lnbmVkIGNvbnN0IGRlZmF1bHRfY29uc29sZV91YXJ0ID0gMjsKICBzdGF0aWMgdW5zaWdu ZWQgY29uc3QgZGVmYXVsdF9jb25zb2xlX3VhcnRfYmF1ZHJhdGUgPSAxMTUyMDA7CgoKcHVibGlj OgoKICBzdGF0aWMgdm9pZCBpbml0KCk7Cn07CiMgMTEgImF1dG8vdGhyZWFkLmgiIDIKIyAxICJh dXRvL3RocmVhZGlkLmgiIDEKIyAxMyAiYXV0by90aHJlYWRpZC5oIgpjbGFzcyBUaHJlYWQ7Cgpj bGFzcyB0aHJlYWRpZF90CnsKCiAgVGhyZWFkICp0OwoKcHVibGljOgoKICB0aHJlYWRpZF90KEw0 X3VpZCBjb25zdCAqcHVibGljX2lkKTsKCiAgdGhyZWFkaWRfdChMNF91aWQgcHVibGljX2lkKTsK CiAgdGhyZWFkaWRfdChUaHJlYWQqIHRocmVhZCk7CgogIFRocmVhZCAqIGxvb2t1cCgpIGNvbnN0 OwoKICBib29sIGlzX25pbCgpIGNvbnN0OwoKICBib29sIGlzX3ZhbGlkKCkgY29uc3Q7Cn07CgoK CgoKCiMgMSAiYXV0by9rbWVtLmgiIDEKCgoKCgoKIyAxICJhdXRvL2tpcC5oIiAxCiMgMTcgImF1 dG8va2lwLmgiCnN0cnVjdCBLZXJuZWxfaW5mbwp7CiAgTXdvcmQgbWFnaWM7CiAgTXdvcmQgdmVy c2lvbjsKICBNd29yZCBvZmZzZXRfdmVyc2lvbl9zdHJpbmdzOwogIE13b3JkIHJlc2VydmVkOwoK CgoKCiAgTXdvcmQgaW5pdF9kZWZhdWx0X2tkZWJ1ZywgZGVmYXVsdF9rZGVidWdfZXhjZXB0aW9u LAogICAgX191bmtub3duLCBkZWZhdWx0X2tkZWJ1Z19lbmQ7CiAgTXdvcmQgc2lnbWEwX2VzcCwg c2lnbWEwX2VpcDsKICBsNF9sb3dfaGlnaF90IHNpZ21hMF9tZW1vcnk7CiAgTXdvcmQgc2lnbWEx X2VzcCwgc2lnbWExX2VpcDsKICBsNF9sb3dfaGlnaF90IHNpZ21hMV9tZW1vcnk7CiAgTXdvcmQg cm9vdF9lc3AsIHJvb3RfZWlwOwogIGw0X2xvd19oaWdoX3Qgcm9vdF9tZW1vcnk7CiAgTXdvcmQg bDRfY29uZmlnOwogIE13b3JkIHJlc2VydmVkMjsKICBNd29yZCBrZGVidWdfY29uZmlnOwogIE13 b3JkIGtkZWJ1Z19wZXJtaXNzaW9uOwoKICBsNF9sb3dfaGlnaF90IG1haW5fbWVtb3J5OwogIGw0 X2xvd19oaWdoX3QgcmVzZXJ2ZWQwLCByZXNlcnZlZDE7CiAgbDRfbG93X2hpZ2hfdCBzZW1pX3Jl c2VydmVkOwogIGw0X2xvd19oaWdoX3QgZGVkaWNhdGVkWzRdOwogIHZvbGF0aWxlIENwdV90aW1l IGNsb2NrOwp9OwojIDggImF1dG8va21lbS5oIiAyCgojIDEgIi4uL3NyYy9saWIvbWluaWxpYmMv aW5jbHVkZS9jc3RkZGVmIiAxCgoKCgoKIyAxICIvdXNyL2xpYi9nY2Mtc25hcHNob3QvbGliL2dj Yy1saWIvaTM4Ni1saW51eC8zLjMvaW5jbHVkZS9zdGRkZWYuaCIgMQojIDcgIi4uL3NyYy9saWIv bWluaWxpYmMvaW5jbHVkZS9jc3RkZGVmIiAyCgpuYW1lc3BhY2Ugc3RkIHsKCgoKICB1c2luZyA6 OnB0cmRpZmZfdDsKICB1c2luZyA6OnNpemVfdDsKCgoKfTsKIyAxMCAiYXV0by9rbWVtLmgiIDIK CgoKIyAxICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9tdWx0aWJvb3QuaCIgMQoj IDI0ICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9tdWx0aWJvb3QuaCIKIyAxICIu Li9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni90eXBlcy5oIiAxCiMgNDYgIi4uL3NyYy9s aWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2L3R5cGVzLmgiCnR5cGVkZWYgdW5zaWduZWQgaW50IG5h dHVyYWxfdDsKIyA1NSAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvdHlwZXMuaCIK dHlwZWRlZiBpbnQgaW50ZWdlcl90OwoKCgoKCnR5cGVkZWYgbmF0dXJhbF90IHZtX29mZnNldF90 OwoKCgoKCgp0eXBlZGVmIG5hdHVyYWxfdCB2bV9zaXplX3Q7CgoKCgoKdHlwZWRlZiBzaWduZWQg Y2hhciBzaWduZWQ4X3Q7CnR5cGVkZWYgc2lnbmVkIHNob3J0IHNpZ25lZDE2X3Q7CnR5cGVkZWYg c2lnbmVkIGxvbmcgc2lnbmVkMzJfdDsKdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIHNpZ25lZDY0 X3Q7CnR5cGVkZWYgdW5zaWduZWQgY2hhciB1bnNpZ25lZDhfdDsKdHlwZWRlZiB1bnNpZ25lZCBz aG9ydCB1bnNpZ25lZDE2X3Q7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bnNpZ25lZDMyX3Q7CnR5 cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVuc2lnbmVkNjRfdDsKdHlwZWRlZiBmbG9hdCBmbG9h dDMyX3Q7CnR5cGVkZWYgZG91YmxlIGZsb2F0NjRfdDsKIyAyNSAiLi4vc3JjL2xpYi9rZXJuL2lu Y2x1ZGUvZmx1eC94ODYvbXVsdGlib290LmgiIDIKCgoKc3RydWN0IG11bHRpYm9vdF9oZWFkZXIK ewoKICAgICAgICB1bnNpZ25lZCBtYWdpYzsKCgogICAgICAgIHVuc2lnbmVkIGZsYWdzOwoKCiAg ICAgICAgdW5zaWduZWQgY2hlY2tzdW07CgoKICAgICAgICB2bV9vZmZzZXRfdCBoZWFkZXJfYWRk cjsKICAgICAgICB2bV9vZmZzZXRfdCBsb2FkX2FkZHI7CiAgICAgICAgdm1fb2Zmc2V0X3QgbG9h ZF9lbmRfYWRkcjsKICAgICAgICB2bV9vZmZzZXRfdCBic3NfZW5kX2FkZHI7CiAgICAgICAgdm1f b2Zmc2V0X3QgZW50cnk7Cn07CiMgNzcgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2 L211bHRpYm9vdC5oIgpzdHJ1Y3QgbXVsdGlib290X2luZm8KewoKCiAgICAgICAgdW5zaWduZWQg ZmxhZ3M7CgoKCiAgICAgICAgdm1fc2l6ZV90IG1lbV9sb3dlcjsKICAgICAgICB2bV9zaXplX3Qg bWVtX3VwcGVyOwoKCgogICAgICAgIHVuc2lnbmVkIGNoYXIgYm9vdF9kZXZpY2VbNF07CgoKCiAg ICAgICAgdm1fb2Zmc2V0X3QgY21kbGluZTsKCgoKICAgICAgICB1bnNpZ25lZCBtb2RzX2NvdW50 OwogICAgICAgIHZtX29mZnNldF90IG1vZHNfYWRkcjsKCgogICAgICAgIHVuaW9uCiAgICAgICAg ewogICAgICAgICAgc3RydWN0CiAgICAgICAgICB7CgoKICAgICAgICAgICAgdm1fc2l6ZV90IHRh YnNpemU7CiAgICAgICAgICAgIHZtX3NpemVfdCBzdHJzaXplOwogICAgICAgICAgICB2bV9vZmZz ZXRfdCBhZGRyOwogICAgICAgICAgICB1bnNpZ25lZCByZXNlcnZlZDsKICAgICAgICAgIH0gYTsK CiAgICAgICAgICBzdHJ1Y3QKICAgICAgICAgIHsKCgogICAgICAgICAgICB1bnNpZ25lZCBudW07 CiAgICAgICAgICAgIHZtX3NpemVfdCBzaXplOwogICAgICAgICAgICB2bV9vZmZzZXRfdCBhZGRy OwogICAgICAgICAgICB1bnNpZ25lZCBzaG5keDsKICAgICAgICAgIH0gZTsKICAgICAgICB9IHN5 bXM7CgoKCiAgICAgICAgdm1fc2l6ZV90IG1tYXBfY291bnQ7CiAgICAgICAgdm1fb2Zmc2V0X3Qg bW1hcF9hZGRyOwp9OwojIDE0NSAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvbXVs dGlib290LmgiCnN0cnVjdCBtdWx0aWJvb3RfbW9kdWxlCnsKCiAgICAgICAgdm1fb2Zmc2V0X3Qg bW9kX3N0YXJ0OwogICAgICAgIHZtX29mZnNldF90IG1vZF9lbmQ7CgoKICAgICAgICB2bV9vZmZz ZXRfdCBzdHJpbmc7CgoKICAgICAgICB1bnNpZ25lZCByZXNlcnZlZDsKfTsKCgoKCgoKc3RydWN0 IEFkZHJSYW5nZURlc2MKewogIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICB1bnNpZ25lZCBsb25nIEJh c2VBZGRyTG93OwogIHVuc2lnbmVkIGxvbmcgQmFzZUFkZHJIaWdoOwogIHVuc2lnbmVkIGxvbmcg TGVuZ3RoTG93OwogIHVuc2lnbmVkIGxvbmcgTGVuZ3RoSGlnaDsKICB1bnNpZ25lZCBsb25nIFR5 cGU7CgoKfTsKIyAxNCAiYXV0by9rbWVtLmgiIDIKIyAxICIuLi9zcmMvbGliL2tlcm4vaW5jbHVk ZS9mbHV4L3g4Ni9wYWdpbmcuaCIgMQojIDM1ICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4 L3g4Ni9wYWdpbmcuaCIKIyAxICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3BhZ2UuaCIg MQojIDQyICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3BhZ2UuaCIKIyAxICIuLi9zcmMv bGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9wYWdlLmgiIDEKIyA0MyAiLi4vc3JjL2xpYi9rZXJu L2luY2x1ZGUvZmx1eC9wYWdlLmgiIDIKIyAzNiAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1 eC94ODYvcGFnaW5nLmgiIDIKIyAxMTggIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2 L3BhZ2luZy5oIgojIDEgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2L3Byb2NfcmVn LmgiIDEKIyA2NyAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvcHJvY19yZWcuaCIK ZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGdldF9lZmxhZ3MoKQp7CiAgICAgICAgdW5zaWduZWQg ZWZsYWdzOwogICAgICAgIGFzbSB2b2xhdGlsZSgicHVzaGYgOyBwb3BsICUwIiA6ICI9ciIgKGVm bGFncykpOwogICAgICAgIHJldHVybiBlZmxhZ3M7Cn0KCmV4dGVybiBfX2lubGluZSB2b2lkIHNl dF9lZmxhZ3ModW5zaWduZWQgZWZsYWdzKQp7CiAgICAgICAgYXNtIHZvbGF0aWxlKCJwdXNobCAl MCA7IHBvcGYiIDogOiAiciIgKGVmbGFncykgOiAibWVtb3J5Iik7Cn0KCmV4dGVybiBfX2lubGlu ZSB2b2lkIGNsaSgpIHsgYXNtIHZvbGF0aWxlICgiY2xpIiA6IDogOiAibWVtb3J5Iik7IH0KZXh0 ZXJuIF9faW5saW5lIHZvaWQgc3RpKCkgeyBhc20gdm9sYXRpbGUgKCJzdGkiIDogOiA6ICJtZW1v cnkiKTsgfQpleHRlcm4gX19pbmxpbmUgdm9pZCBjbGQoKSB7IGFzbSgiY2xkIik7IH0KCgoKCgoK ZXh0ZXJuIF9faW5saW5lIHZvaWQgY2x0cygpIHsgYXNtKCJjbHRzIik7IH0KCmV4dGVybiBfX2lu bGluZSB1bnNpZ25lZCBzaG9ydCBnZXRfY3MoKQp7CiAgICAgICAgdW5zaWduZWQgc2hvcnQgY3M7 CiAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3Z3ICUlY3MsJXcwIiA6ICI9ciIgKGNzKSk7CiAgICAg ICAgcmV0dXJuIGNzOwp9CgpleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RzKCkK ewogICAgICAgIHVuc2lnbmVkIHNob3J0IGRzOwogICAgICAgIGFzbSB2b2xhdGlsZSgibW92dyAl JWRzLCV3MCIgOiAiPXIiIChkcykpOwogICAgICAgIHJldHVybiBkczsKfQpleHRlcm4gX19pbmxp bmUgdm9pZCBzZXRfZHModW5zaWduZWQgc2hvcnQgZHMpCnsKICAgICAgICBhc20gdm9sYXRpbGUo Im1vdncgJXcwLCUlZHMiIDogOiAiciIgKGRzKSk7Cn0KCmV4dGVybiBfX2lubGluZSB1bnNpZ25l ZCBzaG9ydCBnZXRfZXMoKQp7CiAgICAgICAgdW5zaWduZWQgc2hvcnQgZXM7CiAgICAgICAgYXNt IHZvbGF0aWxlKCJtb3Z3ICUlZXMsJXcwIiA6ICI9ciIgKGVzKSk7CiAgICAgICAgcmV0dXJuIGVz Owp9CmV4dGVybiBfX2lubGluZSB2b2lkIHNldF9lcyh1bnNpZ25lZCBzaG9ydCBlcykKewogICAg ICAgIGFzbSB2b2xhdGlsZSgibW92dyAldzAsJSVlcyIgOiA6ICJyIiAoZXMpKTsKfQoKZXh0ZXJu IF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9mcygpCnsKICAgICAgICB1bnNpZ25lZCBzaG9y dCBmczsKICAgICAgICBhc20gdm9sYXRpbGUoIm1vdncgJSVmcywldzAiIDogIj1yIiAoZnMpKTsK ICAgICAgICByZXR1cm4gZnM7Cn0KZXh0ZXJuIF9faW5saW5lIHZvaWQgc2V0X2ZzKHVuc2lnbmVk IHNob3J0IGZzKQp7CiAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3Z3ICV3MCwlJWZzIiA6IDogInIi IChmcykpOwp9CgpleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2dzKCkKewogICAg ICAgIHVuc2lnbmVkIHNob3J0IGdzOwogICAgICAgIGFzbSB2b2xhdGlsZSgibW92dyAlJWdzLCV3 MCIgOiAiPXIiIChncykpOwogICAgICAgIHJldHVybiBnczsKfQpleHRlcm4gX19pbmxpbmUgdm9p ZCBzZXRfZ3ModW5zaWduZWQgc2hvcnQgZ3MpCnsKICAgICAgICBhc20gdm9sYXRpbGUoIm1vdncg JXcwLCUlZ3MiIDogOiAiciIgKGdzKSk7Cn0KCmV4dGVybiBfX2lubGluZSB1bnNpZ25lZCBzaG9y dCBnZXRfc3MoKQp7CiAgICAgICAgdW5zaWduZWQgc2hvcnQgc3M7CiAgICAgICAgYXNtIHZvbGF0 aWxlKCJtb3Z3ICUlc3MsJXcwIiA6ICI9ciIgKHNzKSk7CiAgICAgICAgcmV0dXJuIHNzOwp9CmV4 dGVybiBfX2lubGluZSB2b2lkIHNldF9zcyh1bnNpZ25lZCBzaG9ydCBzcykKewogICAgICAgIGFz bSB2b2xhdGlsZSgibW92dyAldzAsJSVzcyIgOiA6ICJyIiAoc3MpKTsKfQojIDExOSAiLi4vc3Jj L2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvcGFnaW5nLmgiIDIKCgoKCnR5cGVkZWYgdW5zaWdu ZWQgaW50IHB0X2VudHJ5X3Q7CgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgcGRfZW50cnlfdDsKIyAx NDYgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2L3BhZ2luZy5oIgpleHRlcm4gX19p bmxpbmUgdm9pZCBwYWdpbmdfZW5hYmxlKHZtX29mZnNldF90IHBkaXIpCnsKCiAgICAgICAgKHsg cmVnaXN0ZXIgdW5zaWduZWQgaW50IF90ZW1wX18gPSAocGRpcik7IGFzbSB2b2xhdGlsZSgibW92 ICUwLCAlJWNyMyIgOiA6ICJyIiAoX3RlbXBfXykpOyB9KTsKCgogICAgICAgIGFzbSB2b2xhdGls ZSgibW92bCAgJTAsJSVjcjAJXG5cdCIKICAgICAgICAgICAgICAgICAgICAgImptcCAgIDFmCQlc blx0IgogICAgICAgICAgICAgICAgICAgICAiMToJCVxuXHQiCiAgICAgICAgICAgICAgICAgICAg IDogOiAiciIgKCh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfdGVtcF9fOyBhc20gdm9sYXRpbGUo Im1vdiAlJWNyMCwgJTAiIDogIj1yIiAoX3RlbXBfXykpOyBfdGVtcF9fOyB9KSB8IDB4ODAwMDAw MDApKTsKfQojIDE1ICJhdXRvL2ttZW0uaCIgMgoKIyAxICJhdXRvL2tlcm5fdHlwZXMuaCIgMQoj IDEzICJhdXRvL2tlcm5fdHlwZXMuaCIKdGVtcGxhdGU8IHR5cGVuYW1lIF9UeSA+CnN0cnVjdCBQ X3B0cgp7CgpwdWJsaWM6CgogIHR5cGVkZWYgX1R5ICpSYXdfdHlwZTsKICB0eXBlZGVmIHZtX29m ZnNldF90IFVuc2lnbmVkX3R5cGU7CgogIFBfcHRyPCBfVHkgPiAmb3BlcmF0b3IgKysgKCkKICB7 CiAgICArK19fcHRyOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgUF9wdHI8IF9UeSA+ICZvcGVy YXRvciAtLSAoKQogIHsKICAgIC0tX19wdHI7CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICBQX3B0 cjwgX1R5ID4gb3BlcmF0b3IgKysgKGludCkKICB7CiAgICByZXR1cm4gUF9wdHIoX19wdHIrKyk7 CiAgfQoKICBQX3B0cjwgX1R5ID4gb3BlcmF0b3IgLS0gKGludCkKICB7CiAgICByZXR1cm4gUF9w dHIoX19wdHItLSk7CiAgfQoKICBQX3B0cjwgX1R5ID4gb3BlcmF0b3IgKyAoIFNtd29yZCBwZCAp IGNvbnN0CiAgewogICAgcmV0dXJuIFBfcHRyKF9fcHRyICsgcGQpOwogIH0KCiAgUF9wdHI8IF9U eSA+IG9wZXJhdG9yIC0gKCBTbXdvcmQgcGQgKSBjb25zdAogIHsKICAgIHJldHVybiBQX3B0cihf X3B0ciAtIHBkKTsKICB9CgogIFBfcHRyPCBfVHkgPiAmb3BlcmF0b3IgKz0gKCBTbXdvcmQgcGQg KQogIHsKICAgIF9fcHRyICs9IHBkOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgUF9wdHI8IF9U eSA+ICZvcGVyYXRvciAtPSAoIFNtd29yZCBwZCApCiAgewogICAgX19wdHIgLT0gcGQ7CiAgICBy ZXR1cm4gKnRoaXM7CiAgfQoKICBQX3B0cjwgX1R5ID4gb3BlcmF0b3IgJiAoIE13b3JkIG8gKQog IHsKICAgIHJldHVybiAoX1R5KikoKE13b3JkKV9fcHRyICYgbyk7CiAgfQoKICBib29sIG9wZXJh dG9yID09ICggUF9wdHIgY29uc3QgJm8gKSBjb25zdAogIHsKICAgIHJldHVybiAodm9pZCopX19w dHIgPT0gKHZvaWQqKW8uX19wdHI7CiAgfQoKICBib29sIG9wZXJhdG9yICE9ICggUF9wdHIgY29u c3QgJm8gKSBjb25zdAogIHsKICAgIHJldHVybiAodm9pZCopX19wdHIgIT0gKHZvaWQqKW8uX19w dHI7CiAgfQoKICBib29sIGlzX251bGwoKSBjb25zdAogIHsKICAgIHJldHVybiBfX3B0ciA9PSAo dm9pZCopKC0xKTsKICB9CgogIGJvb2wgaXNfaW52YWxpZCgpIGNvbnN0CiAgewogICAgcmV0dXJu IF9fcHRyID09ICh2b2lkKikoLTEpOwogIH0KCiAgX1R5KiBnZXRfcmF3KCkgY29uc3QKICB7CiAg ICByZXR1cm4gX19wdHI7CiAgfQoKICBVbnNpZ25lZF90eXBlIGdldF91bnNpZ25lZCgpIGNvbnN0 CiAgewogICAgcmV0dXJuIChVbnNpZ25lZF90eXBlKV9fcHRyOwogIH0KCiAgUF9wdHI8dm9pZD4g dG9fdm9pZCgpIGNvbnN0CiAgewogICAgcmV0dXJuIFBfcHRyPHZvaWQ+KCh2b2lkKilfX3B0cik7 CiAgfQoKICBQX3B0cjwgX1R5ID4gb3BlcmF0b3IgPSAoX1R5ICpvKQogIHsKICAgIHJldHVybiBQ X3B0cihfX3B0cj0gbyk7CiAgfQoKICBQX3B0cjwgX1R5ID4gb3BlcmF0b3IgPSAoUF9wdHI8X1R5 PiBjb25zdCAmbykKICB7CiAgICByZXR1cm4gUF9wdHIoX19wdHI9IG8uX19wdHIpOwogIH0KCiAg dGVtcGxhdGU8IHR5cGVuYW1lIF9UbyA+CiAgc3RhdGljIFBfcHRyIGNhc3QoIFBfcHRyPCBfVG8g PiBjb25zdCAmbykKICB7CiAgICByZXR1cm4gUF9wdHI8X1R5PihzdGF0aWNfY2FzdDxfVHkqPihv LmdldF9yYXcoKSkpOwogIH0KCiAgZXhwbGljaXQgUF9wdHIoIE13b3JkIGFkZHIgKQogICAgOiBf X3B0cigoX1R5KilhZGRyKQogIHt9CgogIFBfcHRyKCBfVHkgKnAgPSAoX1R5KikoLTEpICkKICAg IDogX19wdHIocCkKICB7fQojIDEzNyAiYXV0by9rZXJuX3R5cGVzLmgiCiAgdGVtcGxhdGU8IHR5 cGVuYW1lIF9UbyA+CiAgUF9wdHIoIFBfcHRyPF9Ubz4gY29uc3QgJm8gKQogICAgOiBfX3B0cihv LmdldF9yYXcoKSkKICB7fQoKcHJpdmF0ZToKCiAgX1R5ICpfX3B0cjsKCn07CiMgMTcgImF1dG8v a21lbS5oIiAyCgoKCiMgMSAiLi4vc3JjL2tlcm4vY29uZmlnX2dkdC5oIiAxCiMgMjEgImF1dG8v a21lbS5oIiAyCiMgMzAgImF1dG8va21lbS5oIgojIDEgIi4uL3NyYy9rZXJuL2lhMzIvbGlua2Vy X3N5bXMuaCIgMQoKCgpleHRlcm4gIkMiIHsKICBleHRlcm4gY2hhciBfc3RhcnQsIF9ldGV4dCwg X3NzdGFjaywgX3N0YWNrLCBfZWRhdGEsIF9lbmQ7CiAgZXh0ZXJuIGNoYXIgX3BoeXNtZW1fMTsK ICBleHRlcm4gY2hhciBfdGNic18xOwogIGV4dGVybiBjaGFyIF9pb2JpdG1hcF8xOwogIGV4dGVy biBjaGFyIF91bnVzZWQxXzEsIF91bnVzZWQyXzEsIF91bnVzZWQzXzEsIF91bnVzZWQ0X2lvXzE7 CiAgZXh0ZXJuIGNoYXIgX2lwY193aW5kb3cwXzEsIF9pcGNfd2luZG93MV8xOwogIGV4dGVybiBj aGFyIF9zZXJ2aWNlOwp9CiMgMzEgImF1dG8va21lbS5oIiAyCgoKCgoKCnN0cnVjdCB4ODZfZ2F0 ZTsKc3RydWN0IHg4Nl90c3M7CnN0cnVjdCB4ODZfZGVzYzsKCgp2b2lkICpvcGVyYXRvciBuZXco c2l6ZV90KTsKdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqYmxvY2spOwoKCmNsYXNzIGttZW0K ewpwdWJsaWM6CiAgc3RhdGljIEtlcm5lbF9pbmZvICppbmZvKCk7CnByaXZhdGU6CgogIGZyaWVu ZCBjbGFzcyBWbWVtX2FsbG9jOwpwdWJsaWM6CgoKCgogIHN0YXRpYyBjb25zdCB2bV9vZmZzZXRf dCBtZW1fcGh5cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm1fb2Zmc2V0X3Q+KCZfcGh5c21lbV8xKTsK CiAgc3RhdGljIGNvbnN0IHZtX29mZnNldF90IG1lbV90Y2JzID0gcmVpbnRlcnByZXRfY2FzdDx2 bV9vZmZzZXRfdD4oJl90Y2JzXzEpOwoKICBzdGF0aWMgY29uc3Qgdm1fb2Zmc2V0X3QgbWVtX3Vz ZXJfbWF4ID0gMHhjMDAwMDAwMDsKCiAgc3RhdGljIGNvbnN0IHZtX29mZnNldF90IGlvX2JpdG1h cCA9CiAgICAgcmVpbnRlcnByZXRfY2FzdDx2bV9vZmZzZXRfdD4oJl9pb2JpdG1hcF8xKTsKCgog IHN0YXRpYyBjb25zdCB2bV9vZmZzZXRfdCBzZXJ2aWNlX3BhZ2UKICAgID0gcmVpbnRlcnByZXRf Y2FzdDx2bV9vZmZzZXRfdD4oJl9zZXJ2aWNlKTsKCiAgc3RhdGljIGNvbnN0IHZtX29mZnNldF90 IGxvY2FsX2FwaWNfcGFnZSA9IHNlcnZpY2VfcGFnZTsKCiAgc3RhdGljIGNvbnN0IHZtX29mZnNl dF90IGpkYl9hZGFwdGVyX3BhZ2UgPSBsb2NhbF9hcGljX3BhZ2UgKyAweDEwMDA7CgogIHN0YXRp YyBjb25zdCB2bV9vZmZzZXRfdCB0YnVmX3N0YXR1c19wYWdlID0gamRiX2FkYXB0ZXJfcGFnZSAr IDB4MTAwMDsKCgoKICBzdGF0aWMgY29uc3Qgdm1fb2Zmc2V0X3QgdGJ1Zl9idWZmZXJfYXJlYSA9 IHNlcnZpY2VfcGFnZSArIDB4MjAwMDAwOwoKICBzdGF0aWMgY29uc3Qgdm1fb2Zmc2V0X3QgaXBj X3dpbmRvdzAKICAgID0gcmVpbnRlcnByZXRfY2FzdDx2bV9vZmZzZXRfdD4oJl9pcGNfd2luZG93 MF8xKTsKCiAgc3RhdGljIGNvbnN0IHZtX29mZnNldF90IGlwY193aW5kb3cxCiAgICA9IHJlaW50 ZXJwcmV0X2Nhc3Q8dm1fb2Zmc2V0X3Q+KCZfaXBjX3dpbmRvdzFfMSk7CgoKCiAgc3RhdGljIHB0 X2VudHJ5X3QgKmpkYl9hZGFwdGVyX3B0OwoKCiAgZW51bSB7IGdkdF90c3MgPSAoMHgwOCksCiAg ICBnZHRfY29kZV9rZXJuZWwgPSAoMHgxMCksIGdkdF9kYXRhX2tlcm5lbCA9ICgweDE4KSwKICAg IGdkdF9jb2RlX3VzZXIgPSAoMHgyMCksIGdkdF9kYXRhX3VzZXIgPSAoMHgyOCksCiAgICBnZHRf bWF4ID0gKDB4MzApIH07CgogIHRlbXBsYXRlPCB0eXBlbmFtZSBfVHkgPgogIHN0YXRpYyBfVHkg KnBoeXNfdG9fdmlydCggUF9wdHI8X1R5PiApOwoKcHJvdGVjdGVkOgogIHN0YXRpYyBwZF9lbnRy eV90ICprZGlyOwogIHN0YXRpYyBwZF9lbnRyeV90IGNwdV9nbG9iYWw7Cgpwcml2YXRlOgogIGZy aWVuZCBjbGFzcyBrZGI7CiAgZnJpZW5kIGNsYXNzIGpkYjsKICBmcmllbmQgY2xhc3MgSmRiX2tl cm5faW5mbzsKICBmcmllbmQgY2xhc3MgcHJvZmlsZTsKCiAga21lbSgpOwogIGttZW0oY29uc3Qg a21lbSYpOwoKICBzdGF0aWMgdm1fb2Zmc2V0X3QgbWVtX21heCwgX2hpbWVtOwoKICBzdGF0aWMg Y29uc3QgcGRfZW50cnlfdCBmbGFnX2dsb2JhbCA9IDB4MjAwOwoKICBzdGF0aWMgeDg2X2dhdGUg KmtpZHQ7CiAgc3RhdGljIHg4Nl90c3Mgdm9sYXRpbGUgKnRzcyBhc20gKCJLTUVNX1RTUyIpOwog IHN0YXRpYyB4ODZfZGVzYyAqZ2R0OwoKICBzdGF0aWMgS2VybmVsX2luZm8gKmtpbmZvOwoKICBz dGF0aWMgVW5zaWduZWQ4ICppb19iaXRtYXBfZGVsaW1pdGVyOwoKcHVibGljOgojIDEzOCAiYXV0 by9rbWVtLmgiCiAgc3RhdGljIHZtX29mZnNldF90IHZpcnRfdG9fcGh5cyhjb25zdCB2b2lkICph ZGRyKTsKCiAgc3RhdGljIHZvaWQgKiBsaW5lYXJfdmlydF90b19waHlzKGNvbnN0IHZvaWQgKmFk ZHIpOwojIDE0OSAiYXV0by9rbWVtLmgiCiAgc3RhdGljIHZvaWQgKnBoeXNfdG9fdmlydCh2bV9v ZmZzZXRfdCBhZGRyKTsKCgoKCgoKICBzdGF0aWMgdm9pZCBkaXJfaW5pdChwZF9lbnRyeV90ICpk KTsKCgoKCiAgc3RhdGljIHZvaWQgdGxiX2ZsdXNoKHZtX29mZnNldF90IGFkZHIpOwoKCiAgc3Rh dGljIHZvaWQgdGxiX2ZsdXNoKCk7CiMgMTczICJhdXRvL2ttZW0uaCIKICBzdGF0aWMgdm1fb2Zm c2V0X3QgaXBjX3dpbmRvdyh1bnNpZ25lZCB3aW4pOwoKCgoKCgogIHN0YXRpYyBjb25zdCBwZF9l bnRyeV90ICpkaXIoKTsKCgoKCgoKCiAgc3RhdGljIHBkX2VudHJ5X3QgcGRlX2dsb2JhbCgpOwoK ICBzdGF0aWMgeDg2X2dhdGUgKmlkdCgpOwoKICBzdGF0aWMgdm1fb2Zmc2V0X3QgaGltZW0oKTsK CgogIHN0YXRpYyB2bV9vZmZzZXRfdCB2b2xhdGlsZSAqa2VybmVsX2VzcCgpOwoKICBzdGF0aWMg dm1fb2Zmc2V0X3QgaW9fYml0bWFwX2RlbGltaXRlcl9wYWdlKHZvaWQpOwoKCgogIHN0YXRpYyB2 b2lkIGluaXQoKTsKfTsKIyAyMTEgImF1dG8va21lbS5oIgojIDEgIi4uL3NyYy9saWIva2Vybi9p bmNsdWRlL2ZsdXgveDg2L3Rzcy5oIiAxCiMgMzIgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2Zs dXgveDg2L3Rzcy5oIgpzdHJ1Y3QgeDg2X3RzcyB7CiAgICAgICAgaW50IGJhY2tfbGluazsKCiAg ICAgICAgaW50IGVzcDA7CiAgICAgICAgaW50IHNzMDsKICAgICAgICBpbnQgZXNwMTsKICAgICAg ICBpbnQgc3MxOwogICAgICAgIGludCBlc3AyOwogICAgICAgIGludCBzczI7CiAgICAgICAgaW50 IGNyMzsKCiAgICAgICAgaW50IGVpcDsKICAgICAgICBpbnQgZWZsYWdzOwogICAgICAgIGludCBl YXg7CiAgICAgICAgaW50IGVjeDsKICAgICAgICBpbnQgZWR4OwogICAgICAgIGludCBlYng7CiAg ICAgICAgaW50IGVzcDsKICAgICAgICBpbnQgZWJwOwogICAgICAgIGludCBlc2k7CiAgICAgICAg aW50IGVkaTsKICAgICAgICBpbnQgZXM7CiAgICAgICAgaW50IGNzOwogICAgICAgIGludCBzczsK ICAgICAgICBpbnQgZHM7CiAgICAgICAgaW50IGZzOwogICAgICAgIGludCBnczsKICAgICAgICBp bnQgbGR0OwogICAgICAgIHVuc2lnbmVkIHNob3J0IHRyYWNlX3RyYXA7CiAgICAgICAgdW5zaWdu ZWQgc2hvcnQgaW9fYml0X21hcF9vZmZzZXQ7CgoKfTsKIyAyMTIgImF1dG8va21lbS5oIiAyCiMg MjI3ICJhdXRvL2ttZW0uaCIKaW5saW5lIHZvaWQgKmttZW06OnBoeXNfdG9fdmlydCh2bV9vZmZz ZXRfdCBhZGRyKQp7CiAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihhZGRyICsgbWVt X3BoeXMpOwp9CgoKCgoKaW5saW5lIHZvaWQga21lbTo6dGxiX2ZsdXNoKHZtX29mZnNldF90IGFk ZHIpCnsKICBhc20gdm9sYXRpbGUKICAgICgiaW52bHBnICUwIiA6IDogIm0iICgqKGNoYXIqKWFk ZHIpIDogIm1lbW9yeSIpOwp9CgoKCgppbmxpbmUgdm9pZCBrbWVtOjp0bGJfZmx1c2goKQp7Cgog IHVuc2lnbmVkIGR1bW15OwogIGFzbSB2b2xhdGlsZSAoIiBtb3YgJSVjcjMsJTA7IG1vdiAlMCwl JWNyMyAiIDogIj1yIihkdW1teSkgKTsKfQojIDI2MSAiYXV0by9rbWVtLmgiCmlubGluZSB2bV9v ZmZzZXRfdAprbWVtOjppcGNfd2luZG93KHVuc2lnbmVkIHdpbikKewogIGlmICh3aW4gPT0gMCkK ICAgIHJldHVybiBpcGNfd2luZG93MDsKCiAgcmV0dXJuIGlwY193aW5kb3cxOwp9CgoKCgoKCgpp bmxpbmUgY29uc3QgcGRfZW50cnlfdCAqa21lbTo6ZGlyKCkKewogIHJldHVybiBrZGlyOwp9CiMg Mjg4ICJhdXRvL2ttZW0uaCIKaW5saW5lIHBkX2VudHJ5X3Qga21lbTo6cGRlX2dsb2JhbCgpCnsK ICByZXR1cm4gY3B1X2dsb2JhbDsKfQoKCgppbmxpbmUgeDg2X2dhdGUgKmttZW06OmlkdCgpCnsK ICByZXR1cm4ga2lkdDsKfQoKCgppbmxpbmUgdm1fb2Zmc2V0X3Qga21lbTo6aGltZW0oKQp7CiAg cmV0dXJuIF9oaW1lbTsKfQoKCgoKaW5saW5lIHZtX29mZnNldF90IHZvbGF0aWxlICprbWVtOjpr ZXJuZWxfZXNwKCkKewogIHJldHVybiByZWludGVycHJldF9jYXN0PHZtX29mZnNldF90IHZvbGF0 aWxlICo+KCYgdHNzLT5lc3AwKTsKfQoKCgppbmxpbmUgdm1fb2Zmc2V0X3Qga21lbTo6aW9fYml0 bWFwX2RlbGltaXRlcl9wYWdlKHZvaWQpCnsKICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2bV9v ZmZzZXRfdD4oaW9fYml0bWFwX2RlbGltaXRlcik7Cn0KIyAzMzEgImF1dG8va21lbS5oIgp0ZW1w bGF0ZTwgdHlwZW5hbWUgX1R5ID4gaW5saW5lIF9UeSAqa21lbTo6cGh5c190b192aXJ0KCBQX3B0 cjxfVHk+IGFkZHIpCnsKICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfVHkgKj4oYWRkci5nZXRf dW5zaWduZWQoKSArIG1lbV9waHlzKTsKfQoKCgoKCmlubGluZSBLZXJuZWxfaW5mbyAqa21lbTo6 aW5mbygpCnsKICByZXR1cm4ga2luZm87Cn0KIyA0MSAiYXV0by90aHJlYWRpZC5oIiAyCiMgMSAi YXV0by90aHJlYWRfdXRpbC5oIiAxCiMgMTMgImF1dG8vdGhyZWFkX3V0aWwuaCIKY2xhc3MgVGhy ZWFkOwoKVGhyZWFkKiBsb29rdXBfdGhyZWFkKEw0X3VpZCBpZCk7CgpUaHJlYWQqIGxvb2t1cF9m aXJzdF90aHJlYWQodW5zaWduZWQgc3BhY2UpOwojIDM0ICJhdXRvL3RocmVhZF91dGlsLmgiCmlu bGluZSBUaHJlYWQqCmxvb2t1cF90aHJlYWQoTDRfdWlkIGlkKQp7CiAgcmV0dXJuIHJlaW50ZXJw cmV0X2Nhc3Q8VGhyZWFkICo+CiAgICAoaWQuaXNfaW52YWxpZCgpCiAgICAgPyAwCiAgICAgOiBr bWVtOjptZW1fdGNicyB8ICgoaWQuZ3RocmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAg KiBDb25maWc6OnRocmVhZF9ibG9ja19zaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgJiB+ Q29uZmlnOjp0aHJlYWRfYmxvY2tfbWFzaykpOwp9CgoKCmlubGluZSBUaHJlYWQqCmxvb2t1cF9m aXJzdF90aHJlYWQodW5zaWduZWQgc3BhY2UpCnsKICByZXR1cm4gbG9va3VwX3RocmVhZCggTDRf dWlkKCBzcGFjZSwgMCApICk7Cn0KIyA0MiAiYXV0by90aHJlYWRpZC5oIiAyCiMgNTEgImF1dG8v dGhyZWFkaWQuaCIKaW5saW5lIHRocmVhZGlkX3Q6OnRocmVhZGlkX3QoTDRfdWlkIGNvbnN0ICpw dWJsaWNfaWQpCiAgOiB0IChsb29rdXBfdGhyZWFkICgqcHVibGljX2lkKSkKeyB9CgoKCmlubGlu ZSB0aHJlYWRpZF90Ojp0aHJlYWRpZF90KEw0X3VpZCBwdWJsaWNfaWQpCiAgOiB0IChsb29rdXBf dGhyZWFkIChwdWJsaWNfaWQpKQp7IH0KCgoKaW5saW5lIHRocmVhZGlkX3Q6OnRocmVhZGlkX3Qo VGhyZWFkKiB0aHJlYWQpCiAgOiB0KHRocmVhZCkKeyB9CgoKCmlubGluZSBUaHJlYWQgKiB0aHJl YWRpZF90Ojpsb29rdXAoKSBjb25zdAp7IHJldHVybiB0OyB9CgoKCmlubGluZSBib29sCnRocmVh ZGlkX3Q6OmlzX25pbCgpIGNvbnN0CnsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQg bG9uZz4odCkgPT0ga21lbTo6bWVtX3RjYnM7IH0KCgoKaW5saW5lIGJvb2wKdGhyZWFkaWRfdDo6 aXNfdmFsaWQoKSBjb25zdAp7IHJldHVybiB0OyB9CiMgMTIgImF1dG8vdGhyZWFkLmgiIDIKIyAx ICJhdXRvL3NwYWNlLmgiIDEKCgoKCgoKIyAxICJhdXRvL3NwYWNlX2luZGV4LmgiIDEKIyAxMSAi YXV0by9zcGFjZV9pbmRleC5oIgpjbGFzcyBTcGFjZTsKY2xhc3MgU3BhY2VfcmVnaXN0cnk7Cgpj bGFzcyBTcGFjZV9pbmRleAp7CnB1YmxpYzoKICBlbnVtIHsgbWF4X3NwYWNlX251bWJlciA9IDEg PDwgMTEgfTsKCnByaXZhdGU6CgogIHN0YXRpYyBTcGFjZV9yZWdpc3RyeSogc3BhY2VzOwoKCiAg dW5zaWduZWQgc3BhY2VfaWQ7CgpwdWJsaWM6CiAgZXhwbGljaXQgU3BhY2VfaW5kZXgodW5zaWdu ZWQgbnVtYmVyKTsKCgogIG9wZXJhdG9yIHVuc2lnbmVkICgpOwoKICBTcGFjZSAqIGxvb2t1cCgp OwoKICBib29sIHNldF9jaGllZihTcGFjZV9pbmRleCBvbGRfY2hpZWYsIFNwYWNlX2luZGV4IG5l d19jaGllZik7CgogIFNwYWNlX2luZGV4IGNoaWVmKCk7CgogIHN0YXRpYyBib29sIGFkZChTcGFj ZSAqbmV3X3NwYWNlLCB1bnNpZ25lZCBuZXdfbnVtYmVyKTsKCiAgc3RhdGljIGJvb2wgZGVsKFNw YWNlX2luZGV4IG51bWJlciwgU3BhY2VfaW5kZXggY2hpZWYpOwp9OwojIDUwICJhdXRvL3NwYWNl X2luZGV4LmgiCiMgMSAiYXV0by9hdG9taWMuaCIgMQojIDE1ICJhdXRvL2F0b21pYy5oIgpleHRl cm4gIkMiIHZvaWQgY2FzX2Vycm9yX3R5cGVfd2l0aF9iYWRfc2l6ZV91c2VkKHZvaWQpOwoKCgoK Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVHlwZSA+IGJvb2wgdXBfY2FzKCBUeXBlICpwdHIsIFR5cGUg b2xkdmFsLCBUeXBlIG5ld3ZhbCApOwoKdGVtcGxhdGU8IHR5cGVuYW1lIFR5cGUgPiBib29sIHNt cF9jYXMoIFR5cGUgKnB0ciwgVHlwZSBvbGR2YWwsIFR5cGUgbmV3dmFsICk7Cgp0ZW1wbGF0ZTwg dHlwZW5hbWUgVHlwZSA+IGJvb2wgdXBfY2FzMiggVHlwZSAqcHRyLCBUeXBlICpvbGR2YWwsIFR5 cGUgKm5ld3ZhbCApOwoKdGVtcGxhdGU8IHR5cGVuYW1lIFR5cGUgPiBib29sIHNtcF9jYXMyKCBU eXBlICpwdHIsIFR5cGUgKm9sZHZhbCwgVHlwZSAqbmV3dmFsICk7CgoKCgoKCgpib29sIHVwX2Nh c191bnNhdmUoIE13b3JkICpwdHIsIE13b3JkIG9sZHZhbCwgTXdvcmQgbmV3dmFsICk7Cgpib29s IHNtcF9jYXNfdW5zYXZlKCBNd29yZCAqcHRyLCBNd29yZCBvbGR2YWwsIE13b3JkIG5ld3ZhbCAp OwoKYm9vbCB1cF9jYXMyX3Vuc2F2ZSggTXdvcmQgKnB0ciwgTXdvcmQgKm9sZHZhbCwgTXdvcmQg Km5ld3ZhbCApOwoKYm9vbCBzbXBfY2FzMl91bnNhdmUoIE13b3JkICpwdHIsIE13b3JkICpvbGR2 YWwsIE13b3JkICpuZXd2YWwgKTsKCmJvb2wgdXBfdGFzKCBNd29yZCAqbCApOwoKYm9vbCBzbXBf dGFzKCBNd29yZCAqbCApOwojIDU1ICJhdXRvL2F0b21pYy5oIgp0ZW1wbGF0ZTwgdHlwZW5hbWUg VHlwZSA+IGlubGluZSBib29sIHVwX2NhcyggVHlwZSAqcHRyLCBUeXBlIG9sZHZhbCwgVHlwZSBu ZXd2YWwgKQp7CiAgaWYoIChzaXplb2YoVHlwZSkpICE9IChzaXplb2YoTXdvcmQpKSApIGNhc19l cnJvcl90eXBlX3dpdGhfYmFkX3NpemVfdXNlZCgpOwogIHJldHVybiB1cF9jYXNfdW5zYXZlKHJl aW50ZXJwcmV0X2Nhc3Q8TXdvcmQqPihwdHIpLAogICAgICAgICAgICAgICAgICAgICAgICpyZWlu dGVycHJldF9jYXN0PE13b3JkKj4oJm9sZHZhbCksCiAgICAgICAgICAgICAgICAgICAgICAgKnJl aW50ZXJwcmV0X2Nhc3Q8TXdvcmQqPigmbmV3dmFsKSk7Cn0KCgoKdGVtcGxhdGU8IHR5cGVuYW1l IFR5cGUgPiBpbmxpbmUgYm9vbCBzbXBfY2FzKCBUeXBlICpwdHIsIFR5cGUgb2xkdmFsLCBUeXBl IG5ld3ZhbCApCnsKICBpZiggKHNpemVvZihUeXBlKSkgIT0gKHNpemVvZihNd29yZCkpICkgY2Fz X2Vycm9yX3R5cGVfd2l0aF9iYWRfc2l6ZV91c2VkKCk7CiAgcmV0dXJuIHNtcF9jYXNfdW5zYXZl KHJlaW50ZXJwcmV0X2Nhc3Q8TXdvcmQqPihwdHIpLAogICAgICAgICAgICAgICAgICAgICAgICAq cmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KCZvbGR2YWwpLAogICAgICAgICAgICAgICAgICAgICAg ICAqcmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KCZuZXd2YWwpKTsKfQoKCgp0ZW1wbGF0ZTwgdHlw ZW5hbWUgVHlwZSA+IGlubGluZSBib29sIHVwX2NhczIoIFR5cGUgKnB0ciwgVHlwZSAqb2xkdmFs LCBUeXBlICpuZXd2YWwgKQp7CiAgaWYoIChzaXplb2YoVHlwZSkpICE9ICgoc2l6ZW9mKE13b3Jk KSoyKSkgKSBjYXNfZXJyb3JfdHlwZV93aXRoX2JhZF9zaXplX3VzZWQoKTsKICByZXR1cm4gdXBf Y2FzMl91bnNhdmUocmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KHB0ciksCiAgICAgICAgICAgICAg ICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXdvcmQqPihvbGR2YWwpLAogICAgICAgICAgICAg ICAgICAgICAgICByZWludGVycHJldF9jYXN0PE13b3JkKj4obmV3dmFsKSk7Cn0KCgoKdGVtcGxh dGU8IHR5cGVuYW1lIFR5cGUgPiBpbmxpbmUgYm9vbCBzbXBfY2FzMiggVHlwZSAqcHRyLCBUeXBl ICpvbGR2YWwsIFR5cGUgKm5ld3ZhbCApCnsKICBpZiggKHNpemVvZihUeXBlKSkgIT0gKChzaXpl b2YoTXdvcmQpKjIpKSApIGNhc19lcnJvcl90eXBlX3dpdGhfYmFkX3NpemVfdXNlZCgpOwogIHJl dHVybiBzbXBfY2FzMl91bnNhdmUocmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KHB0ciksCiAgICAg ICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE13b3JkKj4ob2xkdmFsKSwKICAg ICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXdvcmQqPihuZXd2YWwpKTsK fQojIDEwMiAiYXV0by9hdG9taWMuaCIKaW5saW5lIGJvb2wgdXBfY2FzX3Vuc2F2ZSggTXdvcmQg KnB0ciwgTXdvcmQgb2xkdmFsLCBNd29yZCBuZXd2YWwgKQp7CiAgTXdvcmQgdG1wOwoKICBhc20g dm9sYXRpbGUKICAgICgiY21weGNoZ2wgJTEsJTIiCiAgICAgOiAiPWEiICh0bXApCiAgICAgOiAi ciIgKG5ld3ZhbCksICJtIiAoKnB0ciksICIwIiAob2xkdmFsKQogICAgIDogIm1lbW9yeSIpOwoK ICByZXR1cm4gdG1wID09IG9sZHZhbDsKfQoKCgppbmxpbmUgYm9vbCBzbXBfY2FzX3Vuc2F2ZSgg TXdvcmQgKnB0ciwgTXdvcmQgb2xkdmFsLCBNd29yZCBuZXd2YWwgKQp7CiAgcmV0dXJuIHVwX2Nh c191bnNhdmUocHRyLG9sZHZhbCxuZXd2YWwpOwp9CgoKCmlubGluZSBib29sIHVwX2NhczJfdW5z YXZlKCBNd29yZCAqcHRyLCBNd29yZCAqb2xkdmFsLCBNd29yZCAqbmV3dmFsICkKewogIGNoYXIg cmV0OwogIGFzbSB2b2xhdGlsZQogICAgKCJjbXB4Y2hnOGIgJTMgOyBzZXRlICUlY2wiCiAgICAg OiAiPWMiIChyZXQpLAogICAgICAgIj1hIiAoKiBvbGR2YWwpLAogICAgICAgIj1kIiAoKihvbGR2 YWwrMSkpCiAgICAgOiAibSIgKCpwdHIpICwKICAgICAgICIxIiAoKiBvbGR2YWwpLAogICAgICAg IjIiICgqKG9sZHZhbCsxKSksCiAgICAgICAiYiIgKCogbmV3dmFsKSwKICAgICAgICIwIiAoKihu ZXd2YWwrMSkpCiAgICAgOiAibWVtb3J5Iik7CgogIHJldHVybiByZXQ7Cn0KCgoKaW5saW5lIGJv b2wgc21wX2NhczJfdW5zYXZlKCBNd29yZCAqcHRyLCBNd29yZCAqb2xkdmFsLCBNd29yZCAqbmV3 dmFsICkKewogIHJldHVybiB1cF9jYXMyX3Vuc2F2ZShwdHIsb2xkdmFsLG5ld3ZhbCk7Cn0KCgoK aW5saW5lIGJvb2wgdXBfdGFzKCBNd29yZCAqbCApCnsKICBNd29yZCB0bXA7CiAgYXNtIHZvbGF0 aWxlCiAgICAoInhjaGcgJTAsJTEiIDogIj1yIiAodG1wKSA6ICJtIiAoKmwpLCAiMCIgKDEpCiAg ICAgOiAibWVtb3J5Iik7CgogIHJldHVybiB0bXA7Cn0KCgoKaW5saW5lIGJvb2wgc21wX3Rhcygg TXdvcmQgKmwgKQp7CiAgcmV0dXJuIHVwX3RhcyhsKTsKfQojIDUxICJhdXRvL3NwYWNlX2luZGV4 LmgiIDIKCiMgMSAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL2Nhc3NlcnQiIDEKCgoKCgoj IDEgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9hc3NlcnQuaCIgMQoKCgoKCmV4dGVybiAi QyIgewoKdm9pZCBfX2Fzc2VydF9mYWlsIChjb25zdCBjaGFyICpfX2Fzc2VydGlvbiwgY29uc3Qg Y2hhciAqX19maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19s aW5lLCBjb25zdCBjaGFyICpfX2Z1bmN0aW9uKQogICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0 dXJuX18pKTsKCn0KIyA3ICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1ZGUvY2Fzc2VydCIgMgoj IDUzICJhdXRvL3NwYWNlX2luZGV4LmgiIDIKIyA2MSAiYXV0by9zcGFjZV9pbmRleC5oIgppbmxp bmUgU3BhY2VfaW5kZXg6OlNwYWNlX2luZGV4KHVuc2lnbmVkIG51bWJlcikKCiAgOiBzcGFjZV9p ZChudW1iZXIpCnsgfQoKCgppbmxpbmUgU3BhY2VfaW5kZXg6Om9wZXJhdG9yIHVuc2lnbmVkICgp CnsgcmV0dXJuIHNwYWNlX2lkOyB9CgoKCgpzdHJ1Y3QgU3BhY2VfcmVnaXN0cnkKewogIHVuaW9u IHsKICAgIFNwYWNlICpzcGFjZTsKICAgIHN0cnVjdCB7CiAgICAgIHVuc2lnbmVkIGRlYWQgOiAx OwogICAgICB1bnNpZ25lZCBjaGllZiA6IDMxOwogICAgfSBzdGF0ZTsKICB9OwoKCnB1YmxpYzoK CiAgU3BhY2VfcmVnaXN0cnkoKTsKfTsKCgoKaW5saW5lIFNwYWNlICoKU3BhY2VfaW5kZXg6Omxv b2t1cCgpCnsKICBpZiAoc3BhY2VzW3NwYWNlX2lkXS5zdGF0ZS5kZWFkKQogICAgcmV0dXJuIDA7 CgogIHJldHVybiBzcGFjZXNbc3BhY2VfaWRdLnNwYWNlOwp9CgoKCgppbmxpbmUgU3BhY2VfcmVn aXN0cnk6OlNwYWNlX3JlZ2lzdHJ5KCkKewogIHN0YXRlLmNoaWVmID0gMDsKICBzdGF0ZS5kZWFk ID0gMTsKfQoKCgppbmxpbmUgYm9vbApTcGFjZV9pbmRleDo6c2V0X2NoaWVmKFNwYWNlX2luZGV4 IG9sZF9jaGllZiwgU3BhY2VfaW5kZXggbmV3X2NoaWVmKQp7CiAgU3BhY2VfcmVnaXN0cnkgbyhz cGFjZXNbc3BhY2VfaWRdKTsKCiAgaWYgKCEgby5zdGF0ZS5kZWFkIHx8IG8uc3RhdGUuY2hpZWYg IT0gb2xkX2NoaWVmKQogICAgcmV0dXJuIGZhbHNlOwoKICBTcGFjZV9yZWdpc3RyeSBuOwogIG4u c3RhdGUuY2hpZWYgPSBuZXdfY2hpZWY7CgogIHJldHVybiBzbXBfY2FzKCZzcGFjZXNbc3BhY2Vf aWRdLCBvLCBuKTsKfQoKCgppbmxpbmUgU3BhY2VfaW5kZXgKU3BhY2VfaW5kZXg6OmNoaWVmKCkK ewogICgodm9pZCkgKChzcGFjZXNbc3BhY2VfaWRdLnN0YXRlLmRlYWQpID8gMCA6IChfX2Fzc2Vy dF9mYWlsICgic3BhY2VzW3NwYWNlX2lkXS5zdGF0ZS5kZWFkIiwgImF1dG8vc3BhY2VfaW5kZXgu aCIsIDEzMSwgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsKCiAgcmV0dXJuIFNwYWNlX2luZGV4 KHNwYWNlc1tzcGFjZV9pZF0uc3RhdGUuY2hpZWYpOwp9CgoKCmlubGluZSBib29sClNwYWNlX2lu ZGV4OjphZGQoU3BhY2UgKm5ld19zcGFjZSwgdW5zaWduZWQgbmV3X251bWJlcikKewogIFNwYWNl X3JlZ2lzdHJ5IG8oc3BhY2VzW25ld19udW1iZXJdKTsKICAoKHZvaWQpICgoby5zdGF0ZS5kZWFk KSA/IDAgOiAoX19hc3NlcnRfZmFpbCAoIm8uc3RhdGUuZGVhZCIsICJhdXRvL3NwYWNlX2luZGV4 LmgiLCAxNDIsICgoY29uc3QgY2hhciAqKSAwKSksIDApKSk7CgogIFNwYWNlX3JlZ2lzdHJ5IG47 CiAgbi5zcGFjZSA9IG5ld19zcGFjZTsKCiAgcmV0dXJuIHNtcF9jYXMoJnNwYWNlc1tuZXdfbnVt YmVyXSwgbywgbik7Cn0KCgoKaW5saW5lIGJvb2wKU3BhY2VfaW5kZXg6OmRlbChTcGFjZV9pbmRl eCBudW1iZXIsIFNwYWNlX2luZGV4IGNoaWVmKQp7CiAgKCh2b2lkKSAoKG51bWJlciA8IG1heF9z cGFjZV9udW1iZXIpID8gMCA6IChfX2Fzc2VydF9mYWlsICgibnVtYmVyIDwgbWF4X3NwYWNlX251 bWJlciIsICJhdXRvL3NwYWNlX2luZGV4LmgiLCAxNTUsICgoY29uc3QgY2hhciAqKSAwKSksIDAp KSk7CiAgKCh2b2lkKSAoKCEgc3BhY2VzW251bWJlcl0uc3RhdGUuZGVhZCkgPyAwIDogKF9fYXNz ZXJ0X2ZhaWwgKCIhIHNwYWNlc1tudW1iZXJdLnN0YXRlLmRlYWQiLCAiYXV0by9zcGFjZV9pbmRl eC5oIiwgMTU2LCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwoKCiAgc3BhY2VzW251bWJlcl0u c3RhdGUuZGVhZCA9IDE7CiAgc3BhY2VzW251bWJlcl0uc3RhdGUuY2hpZWYgPSBjaGllZjsKCiAg cmV0dXJuIHRydWU7Cn0KIyA4ICJhdXRvL3NwYWNlLmgiIDIKIyAxICJhdXRvL3NwYWNlX2NvbnRl eHQuaCIgMQojIDIwICJhdXRvL3NwYWNlX2NvbnRleHQuaCIKY2xhc3MgU3BhY2VfY29udGV4dAp7 CnByb3RlY3RlZDoKCiAgcGRfZW50cnlfdCBfZGlyWzEwMjRdOwoKcHVibGljOgogIFNwYWNlX2Nv bnRleHQoKTsKCiAgc3RhdGljIFNwYWNlX2NvbnRleHQgKiBjdXJyZW50KCk7CgogIHZvaWQgbWFr ZV9jdXJyZW50KCk7CgogIHZtX29mZnNldF90IGxvb2t1cCh2bV9vZmZzZXRfdCBhKSBjb25zdDsK CiAgY29uc3QgcGRfZW50cnlfdCogZGlyKCkgY29uc3Q7CgogIHZvaWQgc3dpdGNoaW5fY29udGV4 dCgpOwp9OwojIDQ3ICJhdXRvL3NwYWNlX2NvbnRleHQuaCIKIyAxICJhdXRvL2dsb2JhbHMuaCIg MQojIDE3ICJhdXRvL2dsb2JhbHMuaCIKY2xhc3MgQ29udGV4dDsKY2xhc3MgVGhyZWFkOwpjbGFz cyBTcGFjZTsKCgpleHRlcm4gVGhyZWFkICpzaWdtYTBfdGhyZWFkLCAqa2VybmVsX3RocmVhZCwg Km5pbF90aHJlYWQ7CmV4dGVybiBTcGFjZSAqc2lnbWEwOwpleHRlcm4gYm9vbCBydW5uaW5nOwoj IDQ0ICJhdXRvL2dsb2JhbHMuaCIKQ29udGV4dCAqY29udGV4dF9vZihjb25zdCB2b2lkICpwdHIp OwoKQ29udGV4dCAqY3VycmVudCgpOwojIDY2ICJhdXRvL2dsb2JhbHMuaCIKaW5saW5lIENvbnRl eHQgKmNvbnRleHRfb2YoY29uc3Qgdm9pZCAqcHRyKQp7CiAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nh c3Q8Q29udGV4dCAqPgogICAgKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4ocHRyKSAm IH4oQ29uZmlnOjp0aHJlYWRfYmxvY2tfc2l6ZSAtIDEpKTsKfQoKCgppbmxpbmUgQ29udGV4dCAq Y3VycmVudCgpCnsKICB2b2lkKiBlc3A7CiAgX19hc21fXyBfX3ZvbGF0aWxlX18KICAgICgibW92 bCAlJWVzcCwgJTAiIDogIj1xIiAoZXNwKSk7CgogIHJldHVybiBjb250ZXh0X29mIChlc3ApOwp9 CiMgNDggImF1dG8vc3BhY2VfY29udGV4dC5oIiAyCiMgNTYgImF1dG8vc3BhY2VfY29udGV4dC5o IgppbmxpbmUgU3BhY2VfY29udGV4dCAqIFNwYWNlX2NvbnRleHQ6OmN1cnJlbnQoKQp7CiAgQWRk cmVzcyBzYzsKICBhc20gKCIgbW92ICUlY3IzLCAlMCIgOiAiPXIiKHNjKSApOwogIHJldHVybiBy ZWludGVycHJldF9jYXN0PFNwYWNlX2NvbnRleHQqPihrbWVtOjpwaHlzX3RvX3ZpcnQoc2MpKTsK fQoKCgppbmxpbmUgdm9pZCBTcGFjZV9jb250ZXh0OjptYWtlX2N1cnJlbnQoKQp7CiAgYXNtIHZv bGF0aWxlICgiIG1vdiAlMCwgJSVjcjMiIDogOiAiciIoa21lbTo6dmlydF90b19waHlzKHRoaXMp KSApOwp9CgoKCmlubGluZSB2bV9vZmZzZXRfdApTcGFjZV9jb250ZXh0Ojpsb29rdXAodm1fb2Zm c2V0X3QgYSkgY29uc3QKewojIDg0ICJhdXRvL3NwYWNlX2NvbnRleHQuaCIKICBwZF9lbnRyeV90 IHAgPSBfZGlyWyhhID4+IDIyKSAmIDB4M2ZmXTsKICBpZiAoISAocCAmIDB4MDAwMDAwMDEpKSBy ZXR1cm4gMHhmZmZmZmZmZjsKICBpZiAocCAmIDB4MDAwMDAwODApIHJldHVybiAocCAmIENvbmZp Zzo6U1VQRVJQQUdFX01BU0spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGEg JiB+Q29uZmlnOjpTVVBFUlBBR0VfTUFTSyk7CiAgcHRfZW50cnlfdCB0ID0gcmVpbnRlcnByZXRf Y2FzdDxwdF9lbnRyeV90ICo+CiAgICAoKHAgJiBDb25maWc6OlBBR0VfTUFTSykgKyBrbWVtOjpt ZW1fcGh5cylbKGEgPj4gMTIpICYgMHgzZmZdOwoKICByZXR1cm4gKHQgJiAweDAwMDAwMDAxKSA/ ICh0ICYgQ29uZmlnOjpQQUdFX01BU0spIHwgKGEgJiB+Q29uZmlnOjpQQUdFX01BU0spCiAgICA6 IDB4ZmZmZmZmZmY7Cn0KCgoKaW5saW5lIGNvbnN0IHBkX2VudHJ5X3QqClNwYWNlX2NvbnRleHQ6 OmRpcigpIGNvbnN0CnsKICByZXR1cm4gX2RpcjsKfQoKCgppbmxpbmUgdm9pZApTcGFjZV9jb250 ZXh0Ojpzd2l0Y2hpbl9jb250ZXh0KCkKewoKICBib29sIG5lZWRfZmx1c2hfdGxiID0gZmFsc2U7 CgogIHVuc2lnbmVkIGluZGV4ID0gKGttZW06OmlwY193aW5kb3coMCkgPj4gMjIpICYgMHgzZmY7 CgogIGlmIChfZGlyW2luZGV4XSB8fCBfZGlyIFtpbmRleCArIDFdKQogICAgewogICAgICBfZGly W2luZGV4XSA9IDA7CiAgICAgIF9kaXJbaW5kZXggKyAxXSA9IDA7CiAgICAgIG5lZWRfZmx1c2hf dGxiID0gdHJ1ZTsKICAgIH0KCiAgaW5kZXggPSAoa21lbTo6aXBjX3dpbmRvdygxKSA+PiAyMikg JiAweDNmZjsKCiAgaWYgKF9kaXJbaW5kZXhdIHx8IF9kaXIgW2luZGV4ICsgMV0pCiAgICB7CiAg ICAgIF9kaXJbaW5kZXhdID0gMDsKICAgICAgX2RpcltpbmRleCArIDFdID0gMDsKICAgICAgbmVl ZF9mbHVzaF90bGIgPSB0cnVlOwogICAgfQoKICBpZiAobmVlZF9mbHVzaF90bGIKICAgICAgfHwg U3BhY2VfY29udGV4dDo6Y3VycmVudCgpICE9IHRoaXMpCiAgICB7CiAgICAgIG1ha2VfY3VycmVu dCgpOwogICAgfQp9CiMgOSAiYXV0by9zcGFjZS5oIiAyCiMgMjIgImF1dG8vc3BhY2UuaCIKY2xh c3MgU3BhY2UgOiBwdWJsaWMgU3BhY2VfY29udGV4dAp7CnB1YmxpYzoKCiAgZW51bSBzdGF0dXNf dCB7CiAgICBJbnNlcnRfb2sgPSAwLAogICAgSW5zZXJ0X3dhcm5fZXhpc3RzLAogICAgSW5zZXJ0 X3dhcm5fYXR0cmliX3VwZ3JhZGUsCiAgICBJbnNlcnRfZXJyX25vbWVtLAogICAgSW5zZXJ0X2Vy cl9leGlzdHMKICB9OwoKCiAgZW51bSBwYWdlX2F0dHJpYl90IHsKICAgIFBhZ2Vfbm9fYXR0cmli cyA9IDAsCiAgICBQYWdlX3dyaXRhYmxlID0gMHgwMDAwMDAwMiwKICAgIFBhZ2Vfbm9uY2FjaGVh YmxlID0gMHgwMDAwMDAxMCB8IDB4MDAwMDAwMDgsCgogICAgUGFnZV91c2VyX2FjY2Vzc2libGUg PSAweDAwMDAwMDA0LAoKCiAgICBQYWdlX2FsbF9hdHRyaWJzID0gUGFnZV93cml0YWJsZSB8IFBh Z2Vfbm9uY2FjaGVhYmxlIHwgUGFnZV91c2VyX2FjY2Vzc2libGUKICB9OwoKcHJpdmF0ZToKICBT cGFjZSgpOwogIFNwYWNlKGNvbnN0IFNwYWNlJik7CgoKICBzdGF0aWMgY29uc3QgdW5zaWduZWQg bG9uZyBudW1iZXJfaW5kZXgKICAgID0gKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4o Jl91bnVzZWQxXzEpID4+IDIyKSAmIDB4M2ZmOwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25n IGNoaWVmX2luZGV4CiAgICA9IChyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmc+KCZfdW51 c2VkMl8xKSA+PiAyMikgJiAweDNmZjsKCiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgaW9f Y291bnRlcl9wZF9pbmRleAogICAgPSAocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nPigm X3VudXNlZDRfaW9fMSkgPj4gMjIpICYgMHgzZmY7CiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxv bmcgaW9fY291bnRlcl9wdF9pbmRleAogICAgPSAocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBs b25nPigmX3VudXNlZDRfaW9fMSkgPj4gMTIpICYgMHgzZmY7CgpwdWJsaWM6CgoKCgogIFNwYWNl X2luZGV4IHNwYWNlKCkgY29uc3Q7CgoKCgogIFNwYWNlX2luZGV4IGNoaWVmKCkgY29uc3Q7CiMg ODMgImF1dG8vc3BhY2UuaCIKICBib29sIHVwZGF0ZSh2bV9vZmZzZXRfdCBhZGRyLCBjb25zdCBT cGFjZV9jb250ZXh0ICpmcm9tLCB2bV9vZmZzZXRfdCBmcm9tX2FkZHIpOwoKCiAgdm9pZCAqIG9w ZXJhdG9yIG5ldyhzaXplX3QpOwoKICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpibG9jayk7 CiMgMTAxICJhdXRvL3NwYWNlLmgiCiAgdm1fb2Zmc2V0X3QgdmlydF90b19waHlzKHZtX29mZnNl dF90IGEpIGNvbnN0OwojIDExMSAiYXV0by9zcGFjZS5oIgogIHVuc2lnbmVkIGdldF9pb19jb3Vu dGVyKHZvaWQpOwoKCgoKCiAgYm9vbCBpc19wcml2aWxlZ2VkKHZvaWQpOwoKCgoKCiAgdm9pZCBh ZGR0b19pb19jb3VudGVyKGludCBpbmNyKTsKCgoKCgoKICBib29sIGlvX2xvb2t1cCh2bV9vZmZz ZXRfdCBwb3J0X251bWJlcik7CgoKCgoKCgogIFNwYWNlOjpzdGF0dXNfdCBpb19pbnNlcnQodm1f b2Zmc2V0X3QgcG9ydF9udW1iZXIpOwoKCgoKICB2b2lkIGlvX2RlbGV0ZSh2bV9vZmZzZXRfdCBw b3J0X251bWJlcik7CgoKCgogIH5TcGFjZSgpOwojIDE1NyAiYXV0by9zcGFjZS5oIgogIHZvaWQg a21lbV91cGRhdGUodm1fb2Zmc2V0X3QgYWRkcik7CiMgMTc3ICJhdXRvL3NwYWNlLmgiCiAgU3Bh Y2U6OnN0YXR1c190IHZfaW5zZXJ0KHZtX29mZnNldF90IHBoeXMsIHZtX29mZnNldF90IHZpcnQs IHZtX29mZnNldF90IHNpemUsIHVuc2lnbmVkIHBhZ2VfYXR0cmlicyk7CiMgMTk0ICJhdXRvL3Nw YWNlLmgiCiAgYm9vbCB2X2xvb2t1cCh2bV9vZmZzZXRfdCB2aXJ0LCB2bV9vZmZzZXRfdCAqcGh5 cyA9IDAsIHZtX29mZnNldF90ICpzaXplID0gMCwgdW5zaWduZWQgKnBhZ2VfYXR0cmlicyA9IDAp OwojIDIwNSAiYXV0by9zcGFjZS5oIgogIGJvb2wgdl9kZWxldGUodm1fb2Zmc2V0X3QgdmlydCwg dm1fb2Zmc2V0X3Qgc2l6ZSwgdW5zaWduZWQgcGFnZV9hdHRyaWJzID0gMCk7CiMgMjE3ICJhdXRv L3NwYWNlLmgiCiAgZXhwbGljaXQgU3BhY2UodW5zaWduZWQgbmV3X251bWJlcik7CgoKCgoKCiAg dm9pZCBwYWdlX21hcCh2bV9vZmZzZXRfdCwgdm1fb2Zmc2V0X3QsIHZtX29mZnNldF90LCB1bnNp Z25lZCk7CgogIHZvaWQgcGFnZV9wcm90ZWN0KHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCwgdW5z aWduZWQpOwoKICB2b2lkIHBhZ2VfdW5tYXAodm1fb2Zmc2V0X3QsIHZtX29mZnNldF90KTsKCnBy aXZhdGU6CgoKCiAgdm1fb2Zmc2V0X3QgZ2V0X3ZpcnRfcG9ydF9hZGRyKHZtX29mZnNldF90IGNv bnN0IHBvcnQpIGNvbnN0OwoKICB2bV9vZmZzZXRfdCBnZXRfcGh5c19wb3J0X2FkZHIodm1fb2Zm c2V0X3QgY29uc3QgcG9ydCkgY29uc3Q7Cn07CgoKU3BhY2UgKiBjdXJyZW50X3NwYWNlKCk7CgpV bnNpZ25lZDggZ2V0X3BvcnRfYml0KHZtX29mZnNldF90IGNvbnN0IHBvcnQpOwojIDI2MCAiYXV0 by9zcGFjZS5oIgppbmxpbmUgU3BhY2VfaW5kZXgKU3BhY2U6OnNwYWNlKCkgY29uc3QKewogIHJl dHVybiBTcGFjZV9pbmRleChfZGlyW251bWJlcl9pbmRleF0gPj4gOCk7Cn0KCgoKCgppbmxpbmUg U3BhY2VfaW5kZXgKU3BhY2U6OmNoaWVmKCkgY29uc3QKewogIHJldHVybiBTcGFjZV9pbmRleChf ZGlyW2NoaWVmX2luZGV4XSA+PiA4KTsKfQojIDI4NyAiYXV0by9zcGFjZS5oIgppbmxpbmUgYm9v bApTcGFjZTo6dXBkYXRlKHZtX29mZnNldF90IGFkZHIsIGNvbnN0IFNwYWNlX2NvbnRleHQgKmZy b20sCiAgICAgICAgICAgICAgICB2bV9vZmZzZXRfdCBmcm9tX2FkZHIpCnsKICBpZiAoZnJvbS0+ bG9va3VwKGZyb21fYWRkcikgPT0gMHhmZmZmZmZmZikKICAgIHJldHVybiBmYWxzZTsKCiAgX2Rp clsoYWRkciA+PiAyMikgJiAweDNmZl0KICAgID0gZnJvbS0+ZGlyKClbKGZyb21fYWRkciA+PiAy MikgJiAweDNmZl07CiAgcmV0dXJuIHRydWU7Cn0KIyAzMTIgImF1dG8vc3BhY2UuaCIKaW5saW5l IHZtX29mZnNldF90ClNwYWNlOjp2aXJ0X3RvX3BoeXModm1fb2Zmc2V0X3QgYSkgY29uc3QKewog IGlmICh0aGlzID09IHNpZ21hMCkKICAgIHJldHVybiBhOwoKICByZXR1cm4gU3BhY2VfY29udGV4 dDo6bG9va3VwKGEpOwp9CgoKCgoKCgppbmxpbmUgYm9vbApTcGFjZTo6aXNfcHJpdmlsZWdlZCh2 b2lkKQp7CiAgcmV0dXJuICEgQ29uZmlnOjplbmFibGVfaW9fcHJvdGVjdGlvbgogICAgICAgICB8 fCAoZ2V0X2lvX2NvdW50ZXIoKSA9PSAoMUwgPDwgMTYpKTsKfQojIDM0MiAiYXV0by9zcGFjZS5o IgppbmxpbmUgdm9pZApTcGFjZTo6a21lbV91cGRhdGUodm1fb2Zmc2V0X3QgYWRkcikKewogIHVu c2lnbmVkIGkgPSAoYWRkciA+PiAyMikgJiAweDNmZjsKICBfZGlyW2ldID0ga21lbTo6ZGlyKClb aV07Cn0KIyAzNTYgImF1dG8vc3BhY2UuaCIKaW5saW5lIHZvaWQKU3BhY2U6OnBhZ2VfbWFwKHZt X29mZnNldF90LCB2bV9vZmZzZXRfdCwgdm1fb2Zmc2V0X3QsIHVuc2lnbmVkKQp7fQoKCgppbmxp bmUgdm9pZApTcGFjZTo6cGFnZV9wcm90ZWN0KHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCwgdW5z aWduZWQpCnt9CgoKCmlubGluZSB2b2lkClNwYWNlOjpwYWdlX3VubWFwKHZtX29mZnNldF90LCB2 bV9vZmZzZXRfdCkKe30KCgoKCmlubGluZSBTcGFjZSAqCmN1cnJlbnRfc3BhY2UoKQp7CiAgcmV0 dXJuIHN0YXRpY19jYXN0PFNwYWNlKj4oU3BhY2VfY29udGV4dDo6Y3VycmVudCgpKTsKfQoKCgpp bmxpbmUgVW5zaWduZWQ4IGdldF9wb3J0X2JpdCh2bV9vZmZzZXRfdCBjb25zdCBwb3J0KQp7CiAg cmV0dXJuIDEgPDwgKHBvcnQgJiA3KTsKfQojIDEzICJhdXRvL3RocmVhZC5oIiAyCiMgMSAiYXV0 by9zZW5kZXIuaCIgMQojIDEzICJhdXRvL3NlbmRlci5oIgpjbGFzcyBSZWNlaXZlcjsKCgoKY2xh c3MgU2VuZGVyCnsKcHVibGljOgoKCgogIHZpcnR1YWwgdm9pZCBpcGNfcmVjZWl2ZXJfcmVhZHko KSA9IDA7Cgpwcml2YXRlOgoKCgogICAgICAgICAgICAgTDRfdWlkIF9pZDsKICAgICAgICAgICAg IFJlY2VpdmVyKiBfc2VuZF9wYXJ0bmVyOwogICAgICAgICAgICAgU2VuZGVyKiBzZW5kZXJfbmV4 dCwgKiBzZW5kZXJfcHJldjsKCgoKICBmcmllbmQgY2xhc3MgamRiOwogIGZyaWVuZCBjbGFzcyBq ZGJfdGhyZWFkX2xpc3Q7CgpwdWJsaWM6CgoKCiAgTDRfdWlkIGlkKCkgY29uc3Q7CgoKCgogIFJl Y2VpdmVyKiByZWNlaXZlcigpIGNvbnN0OwojIDU3ICJhdXRvL3NlbmRlci5oIgogIGJvb2wgaW5f c2VuZGVyX2xpc3QoKTsKCnByb3RlY3RlZDoKCgoKCgoKCiAgU2VuZGVyKGNvbnN0IEw0X3VpZCYg aWQpOwojIDc3ICJhdXRvL3NlbmRlci5oIgogIGV4cGxpY2l0IFNlbmRlcihjb25zdCBMNF91aWQm IGlkLCBpbnQgKTsKCgoKCiAgdm9pZCBzZXRfcmVjZWl2ZXIoUmVjZWl2ZXIqIHJlY2VpdmVyKTsK CgoKCiAgdm9pZCBzZW5kZXJfZW5xdWV1ZShTZW5kZXIgKipyKTsKCgoKCiAgdm9pZCBzZW5kZXJf ZGVxdWV1ZShTZW5kZXIgKipyKTsKfTsKIyAxMDIgImF1dG8vc2VuZGVyLmgiCiMgMSAiYXV0by9j cHVfbG9jay5oIiAxCiMgMjIgImF1dG8vY3B1X2xvY2suaCIKY2xhc3MgQ3B1X2xvY2sKewpwdWJs aWM6CgogIHR5cGVkZWYgTXdvcmQgU3RhdHVzOwoKCiAgQ3B1X2xvY2soKTsKCgoKCgogIFN0YXR1 cyB0ZXN0KCkgY29uc3Q7CgoKCgoKCiAgdm9pZCBsb2NrKCk7CgoKCgogIHZvaWQgY2xlYXIoKTsK CgoKCgoKICBTdGF0dXMgdGVzdF9hbmRfc2V0KCk7CgoKCgoKICB2b2lkIHNldChTdGF0dXMgc3Rh dGUpOwoKcHJpdmF0ZToKCiAgQ3B1X2xvY2sgKGNvbnN0IENwdV9sb2NrJik7Cgp9OwoKCgoKCmV4 dGVybiBDcHVfbG9jayBjcHVfbG9jazsKIyA4NSAiYXV0by9jcHVfbG9jay5oIgojIDEgIi4uL3Ny Yy9kcml2ZXJzL3Byb2Nlc3Nvci5oIiAxCgoKCgoKIyAxICIuLi9zcmMvZHJpdmVycy9pYTMyL3By b2Nlc3Nvci1hcmNoLmgiIDEKCgoKCgoKIyAxICJhdXRvL3N0ZF9tYWNyb3MuaCIgMQoKCgoKCiMg MSAiZ2xvYmFsY29uZmlnLmgiIDEKIyA3ICJhdXRvL3N0ZF9tYWNyb3MuaCIgMgojIDggIi4uL3Ny Yy9kcml2ZXJzL2lhMzIvcHJvY2Vzc29yLWFyY2guaCIgMgoKbmFtZXNwYWNlIFByb2MgewoKICB0 eXBlZGVmIFVuc2lnbmVkMzIgU3RhdHVzOwoKICBpbmxpbmUKICB2b2lkIHBhdXNlKCkKICB7CiAg ICBhc20gdm9sYXRpbGUgKCIgLmJ5dGUgMHhmMywgMHg5MCAjcGF1c2UgXG4iICk7CiAgfQojIDI3 ICIuLi9zcmMvZHJpdmVycy9pYTMyL3Byb2Nlc3Nvci1hcmNoLmgiCiAgaW5saW5lCiAgdm9pZCBo YWx0KCkKICB7CiAgICBhc20gdm9sYXRpbGUgKCIgaGx0IiA6IDogOiAibWVtb3J5Iik7CiAgfQoK ICBpbmxpbmUKICB2b2lkIGNsaSgpCiAgewogICAgYXNtIHZvbGF0aWxlICgiY2xpIiA6IDogOiAi bWVtb3J5Iik7CiAgfQoKICBpbmxpbmUKICB2b2lkIHN0aSgpCiAgewogICAgYXNtIHZvbGF0aWxl ICgic3RpIiA6IDogOiAibWVtb3J5Iik7CiAgfQoKICBpbmxpbmUKICBTdGF0dXMgY2xpX3NhdmUo KQogIHsKICAgIFN0YXR1cyByZXQ7CiAgICBhc20gdm9sYXRpbGUgKCJwdXNoZmwJXG5cdCIKICAg ICAgICAgICAgICAgICAgInBvcGwgJTAJXG5cdCIKICAgICAgICAgICAgICAgICAgImNsaQkJXG5c dCIKICAgICAgICAgICAgICAgICAgOiAiPWciKHJldCkgOiA6ICJtZW1vcnkiKTsKICAgIHJldHVy biByZXQ7CiAgfQoKICBpbmxpbmUKICB2b2lkIHN0aV9yZXN0b3JlKCBTdGF0dXMgc3QgKQogIHsK ICAgIGFzbSB2b2xhdGlsZSAoInRlc3RsICQweDAyMDAsICUwCVxuXHQiCiAgICAgICAgICAgICAg ICAgICJqeiAxZgkJXG5cdCIKICAgICAgICAgICAgICAgICAgInN0aQkJCVxuXHQiCiAgICAgICAg ICAgICAgICAgICIxOgkJCVxuXHQiCiAgICAgICAgICAgICAgICAgIDogOiAiZyIoc3QpIDogIm1l bW9yeSIpOwogIH0KCiAgaW5saW5lCiAgU3RhdHVzIGludGVycnVwdHMoKQogIHsKICAgIFN0YXR1 cyByZXQ7CiAgICBhc20gdm9sYXRpbGUgKCJwdXNoZmwgICAgICAgICBcbiIKICAgICAgICAgICAg ICAgICAgInBvcGwgJTAgICAgICAgIFxuIgogICAgICAgICAgICAgICAgICA6ICI9ZyIocmV0KSA6 IDogIm1lbW9yeSIpOwogICAgcmV0dXJuIHJldCAmIDB4MDIwMDsKICB9Cn07CiMgNyAiLi4vc3Jj L2RyaXZlcnMvcHJvY2Vzc29yLmgiIDIKCgpuYW1lc3BhY2UgUHJvYyB7CiMgMjAgIi4uL3NyYy9k cml2ZXJzL3Byb2Nlc3Nvci5oIgogIHZvaWQgY2xpKCk7CgoKICB2b2lkIHN0aSgpOwoKCiAgU3Rh dHVzIGludGVycnVwdHMoKTsKCgogIFN0YXR1cyBjbGlfc2F2ZSgpOwoKCiAgdm9pZCBzdGlfcmVz dG9yZSggU3RhdHVzICk7CgogIHZvaWQgcGF1c2UoKTsKCiAgdm9pZCBoYWx0KCk7Cgp9OwojIDg2 ICJhdXRvL2NwdV9sb2NrLmgiIDIKIyA5NSAiYXV0by9jcHVfbG9jay5oIgppbmxpbmUgQ3B1X2xv Y2s6OlN0YXR1cyBDcHVfbG9jazo6dGVzdF9hbmRfc2V0KCkKewogIFN0YXR1cyByZXQgPSB0ZXN0 KCk7CiAgbG9jaygpOwogIHJldHVybiByZXQ7Cn0KCgoKCmlubGluZSB2b2lkIENwdV9sb2NrOjpz ZXQoQ3B1X2xvY2s6OlN0YXR1cyBzdGF0ZSkKewogIGlmIChzdGF0ZSkKICAgIGxvY2soKTsKICBl bHNlCiAgICBjbGVhcigpOwp9CgoKCmlubGluZSB2b2lkIENwdV9sb2NrOjpsb2NrKCkKewogIFBy b2M6OmNsaSgpOwp9CgoKCmlubGluZSB2b2lkCkNwdV9sb2NrOjpjbGVhcigpCnsKICBQcm9jOjpz dGkoKTsKfQoKCgppbmxpbmUgQ3B1X2xvY2s6OlN0YXR1cyBDcHVfbG9jazo6dGVzdCgpIGNvbnN0 CnsKICByZXR1cm4gISBQcm9jOjppbnRlcnJ1cHRzKCk7Cn0KIyAxMDMgImF1dG8vc2VuZGVyLmgi IDIKIyAxICJhdXRvL2xvY2tfZ3VhcmQuaCIgMQojIDE0ICJhdXRvL2xvY2tfZ3VhcmQuaCIKdGVt cGxhdGU8dHlwZW5hbWUgTE9DSz4KY2xhc3MgTG9ja19ndWFyZAp7CiAgTE9DSyAqX2xvY2s7Cgpw dWJsaWM6CiAgTG9ja19ndWFyZChMT0NLICpsKTsKCiAgfkxvY2tfZ3VhcmQoKTsKfTsKIyAzMiAi YXV0by9sb2NrX2d1YXJkLmgiCnRlbXBsYXRlPHR5cGVuYW1lIExPQ0s+IGlubGluZSBMb2NrX2d1 YXJkPExPQ0s+OjpMb2NrX2d1YXJkKExPQ0sgKmwpCiAgOiBfbG9jayhsKQp7CiAgaWYgKF9sb2Nr LT50ZXN0X2FuZF9zZXQoKSkKICAgIF9sb2NrID0gMDsKfQoKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBM T0NLPiBpbmxpbmUgTG9ja19ndWFyZDxMT0NLPjo6fkxvY2tfZ3VhcmQoKQp7CiAgaWYgKF9sb2Nr KQogICAgX2xvY2stPmNsZWFyKCk7Cn0KIyAxMDQgImF1dG8vc2VuZGVyLmgiIDIKIyAxMTUgImF1 dG8vc2VuZGVyLmgiCmlubGluZSBMNF91aWQgU2VuZGVyOjppZCgpIGNvbnN0CnsgcmV0dXJuIF9p ZDsgfQoKCgoKCgppbmxpbmUgUmVjZWl2ZXIqIFNlbmRlcjo6cmVjZWl2ZXIoKSBjb25zdAp7IHJl dHVybiBfc2VuZF9wYXJ0bmVyOyB9CiMgMTM2ICJhdXRvL3NlbmRlci5oIgppbmxpbmUgYm9vbApT ZW5kZXI6OmluX3NlbmRlcl9saXN0KCkKewogIHJldHVybiBzZW5kZXJfbmV4dDsKfQojIDE1MSAi YXV0by9zZW5kZXIuaCIKaW5saW5lIFNlbmRlcjo6U2VuZGVyKGNvbnN0IEw0X3VpZCYgaWQpCiAg OiBfaWQgKGlkKSwgc2VuZGVyX25leHQgKDApCnt9CiMgMTY0ICJhdXRvL3NlbmRlci5oIgppbmxp bmUgU2VuZGVyOjpTZW5kZXIoY29uc3QgTDRfdWlkJiBpZCwgaW50ICkKICA6IF9pZCAoaWQpCnt9 CgoKCgoKCmlubGluZSB2b2lkIFNlbmRlcjo6c2V0X3JlY2VpdmVyKFJlY2VpdmVyKiByZWNlaXZl cikKewogIF9zZW5kX3BhcnRuZXIgPSByZWNlaXZlcjsKfQoKCgoKCgppbmxpbmUgdm9pZApTZW5k ZXI6OnNlbmRlcl9lbnF1ZXVlKFNlbmRlciAqKnIpCnsKICBMb2NrX2d1YXJkPENwdV9sb2NrPiBn dWFyZCAoJmNwdV9sb2NrKTsKCiAgaWYgKCEgaW5fc2VuZGVyX2xpc3QoKSkKICAgIHsKICAgICAg aWYgKCpyKQogICAgICAgIHsKICAgICAgICAgIHNlbmRlcl9uZXh0ID0gKnI7CiAgICAgICAgICBz ZW5kZXJfcHJldiA9IHNlbmRlcl9uZXh0LT5zZW5kZXJfcHJldjsKICAgICAgICAgIHNlbmRlcl9w cmV2LT5zZW5kZXJfbmV4dCA9IHRoaXM7CiAgICAgICAgICBzZW5kZXJfbmV4dC0+c2VuZGVyX3By ZXYgPSB0aGlzOwogICAgICAgIH0KICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICpyID0g c2VuZGVyX3ByZXYgPSBzZW5kZXJfbmV4dCA9IHRoaXM7CiAgICAgICAgfQogICAgfQp9CgoKCgoK CmlubGluZSB2b2lkClNlbmRlcjo6c2VuZGVyX2RlcXVldWUoU2VuZGVyICoqcikKewogIExvY2tf Z3VhcmQ8Q3B1X2xvY2s+IGd1YXJkICgmY3B1X2xvY2spOwoKICBpZiAoaW5fc2VuZGVyX2xpc3Qo KSkKICAgIHsKICAgICAgaWYgKHNlbmRlcl9uZXh0ID09IHRoaXMpCiAgICAgICAgewogICAgICAg ICAgKCh2b2lkKSAoKCpyID09IHRoaXMpID8gMCA6IChfX2Fzc2VydF9mYWlsICgiKnIgPT0gdGhp cyIsICJhdXRvL3NlbmRlci5oIiwgMjE4LCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwoKICAg ICAgICAgICpyID0gMDsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBp ZiAoKnIgPT0gdGhpcykKICAgICAgICAgICAgKnIgPSBzZW5kZXJfbmV4dDsKCiAgICAgICAgICBz ZW5kZXJfcHJldi0+c2VuZGVyX25leHQgPSBzZW5kZXJfbmV4dDsKICAgICAgICAgIHNlbmRlcl9u ZXh0LT5zZW5kZXJfcHJldiA9IHNlbmRlcl9wcmV2OwogICAgICAgIH0KCiAgICAgIHNlbmRlcl9u ZXh0ID0gMDsKICAgIH0KfQojIDE0ICJhdXRvL3RocmVhZC5oIiAyCiMgMSAiYXV0by9yZWNlaXZl ci5oIiAxCgoKCgoKIyAxICJhdXRvL2NvbnRleHQuaCIgMQoKCgoKCiMgMSAiLi4vc3JjL2xpYi9t aW5pbGliYy9pbmNsdWRlL2NzdGRpbyIgMQoKCgoKCiMgMSAiLi4vc3JjL2xpYi9taW5pbGliYy9p bmNsdWRlL3N0ZGlvLmgiIDEKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLXNuYXBzaG90L2xpYi9nY2Mt bGliL2kzODYtbGludXgvMy4zL2luY2x1ZGUvc3RkZGVmLmgiIDEKIyA2ICIuLi9zcmMvbGliL21p bmlsaWJjL2luY2x1ZGUvc3RkaW8uaCIgMgojIDEgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVk ZS9taW5pX2RlZnMuaCIgMQojIDcgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9zdGRpby5o IiAyCgpleHRlcm4gIkMiIHsKCmludCBwdXRjaGFyKGludCBjKTsKaW50IHB1dHMoY29uc3QgY2hh ciAqcyk7CmludCBwdXRzdHIoY29uc3QgY2hhciAqY29uc3Qgcyk7CmludCBwdXRuc3RyKCBjb25z dCBjaGFyICpjb25zdCBjLCBpbnQgbGVuICk7CmludCBwcmludGYoY29uc3QgY2hhciAqZm9ybWF0 LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMSwyKSkpOwppbnQgc3ByaW50Zihj aGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQo cHJpbnRmLDIsMykpKTsKaW50IHNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0 IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDMsNCkpKTsK aW50IGFzcHJpbnRmKGNoYXIgKipwdHIsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSBfX2F0dHJp YnV0ZV9fKChmb3JtYXQocHJpbnRmLDIsMykpKTsKCgoKCgoKIyAxICIuLi9zcmMvbGliL21pbmls aWJjL2luY2x1ZGUvc3RkYXJnLmgiIDEKIyA5ICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1ZGUv c3RkYXJnLmgiCnR5cGVkZWYgX19idWlsdGluX3ZhX2xpc3QgdmFfbGlzdDsKIyAyNSAiLi4vc3Jj L2xpYi9taW5pbGliYy9pbmNsdWRlL3N0ZGlvLmgiIDIKCmludCB2cHJpbnRmKGNvbnN0IGNoYXIg KmZvcm1hdCwgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwxLDApKSk7 CmludCB2c3ByaW50ZihjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkg X19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwyLDApKSk7CmludCB2c25wcmludGYoY2hhciAq c3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKSBfX2F0dHJp YnV0ZV9fKChmb3JtYXQocHJpbnRmLDMsMCkpKTsKCgp0eXBlZGVmIGludCBGSUxFOwoKaW50IGdl dGNoYXIodm9pZCk7CmNoYXIgKmdldHMoY2hhciAqcykgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRl ZCkpOwpjaGFyICpmZ2V0cyhjaGFyICpzLCBpbnQgc2l6ZSwgRklMRSAqc3RyZWFtKTsKCmludCB2 c2NhbmYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKSBfX2F0dHJpYnV0ZV9fKChmb3Jt YXQoc2NhbmYsMSwwKSkpOwppbnQgdnNzY2FuZihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIg KmZvcm1hdCwgdmFfbGlzdCBhcCkgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHNjYW5mLDIsMCkpKTsK CmludCBzc2NhbmYoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Cgp9 CiMgNyAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL2NzdGRpbyIgMgoKCm5hbWVzcGFjZSBz dGQgewogIHVzaW5nIDo6cHV0Y2hhcjsKICB1c2luZyA6OnB1dHM7CiAgdXNpbmcgOjpwdXRzdHI7 CiAgdXNpbmcgOjpwdXRuc3RyOwogIHVzaW5nIDo6cHJpbnRmOwogIHVzaW5nIDo6c3ByaW50ZjsK ICB1c2luZyA6OnNucHJpbnRmOwogIHVzaW5nIDo6YXNwcmludGY7CiAgdXNpbmcgOjpzc2NhbmY7 CgogIHVzaW5nIDo6dnByaW50ZjsKICB1c2luZyA6OnZzcHJpbnRmOwogIHVzaW5nIDo6dnNucHJp bnRmOwogIHVzaW5nIDo6Z2V0Y2hhcjsKICB1c2luZyA6OmdldHM7CiAgdXNpbmcgOjpmZ2V0czsK ICB1c2luZyA6OnZzY2FuZjsKICB1c2luZyA6OnZzc2NhbmY7Cgp9OwojIDcgImF1dG8vY29udGV4 dC5oIiAyCgoKCiMgMSAiYXV0by9zY2hlZC5oIiAxCiMgMTQgImF1dG8vc2NoZWQuaCIKY2xhc3Mg c2NoZWRfdAp7CiAgdW5zaWduZWQgc2hvcnQgX3ByaW87CiAgdW5zaWduZWQgc2hvcnQgX21jcDsK ICB1bnNpZ25lZCBzaG9ydCBfdGltZXNsaWNlLCBfdGlja3NfbGVmdDsKICB1bnNpZ25lZCBsb25n IF90b3RhbF90aWNrczsKICB1bnNpZ25lZCBsb25nIF9zdGFydF9jcHV0aW1lOwogIHVuc2lnbmVk IGxvbmcgbG9uZyBfdG90YWxfY3B1dGltZTsKCnB1YmxpYzoKICB1bnNpZ25lZCBzaG9ydCBwcmlv KCkgY29uc3Q7CgogIHZvaWQgc2V0X3ByaW8odW5zaWduZWQgc2hvcnQgcHJpbyk7CgogIHVuc2ln bmVkIHNob3J0IG1jcCgpIGNvbnN0OwoKICB2b2lkIHNldF9tY3AodW5zaWduZWQgc2hvcnQgbWNw KTsKCiAgdW5zaWduZWQgc2hvcnQgdGltZXNsaWNlKCkgY29uc3Q7CgogIHZvaWQgc2V0X3RpbWVz bGljZSh1bnNpZ25lZCBzaG9ydCB0aW1lc2xpY2UpOwoKICB1bnNpZ25lZCBzaG9ydCB0aWNrc19s ZWZ0KCkgY29uc3Q7CgogIHZvaWQgc2V0X3RpY2tzX2xlZnQodW5zaWduZWQgc2hvcnQgdGlja3Nf bGVmdCk7CgogIHZvaWQgcmVzZXRfY3B1dGltZSh2b2lkKTsKCiAgdm9pZCB1cGRhdGVfY3B1dGlt ZSh2b2lkKTsKCiAgdW5zaWduZWQgbG9uZyBsb25nIGdldF90b3RhbF9jcHV0aW1lKCk7CgogIHZv aWQgc3RhcnRfdGhyZWFkKHVuc2lnbmVkIGxvbmcgdHNjXzMyKTsKCiAgdm9pZCBzdG9wX3RocmVh ZCh1bnNpZ25lZCBsb25nIHRzY18zMik7Cn07CiMgNTggImF1dG8vc2NoZWQuaCIKaW5saW5lIHVu c2lnbmVkIHNob3J0CnNjaGVkX3Q6OnByaW8oKSBjb25zdAp7CiAgcmV0dXJuIF9wcmlvOwp9CgoK CmlubGluZSB2b2lkCnNjaGVkX3Q6OnNldF9wcmlvKHVuc2lnbmVkIHNob3J0IHByaW8pCnsKICBf cHJpbyA9IHByaW87Cn0KCgoKaW5saW5lIHVuc2lnbmVkIHNob3J0CnNjaGVkX3Q6Om1jcCgpIGNv bnN0CnsKICByZXR1cm4gX21jcDsKfQoKCgppbmxpbmUgdm9pZApzY2hlZF90OjpzZXRfbWNwKHVu c2lnbmVkIHNob3J0IG1jcCkKewogIF9tY3AgPSBtY3A7Cn0KCgoKaW5saW5lIHVuc2lnbmVkIHNo b3J0CnNjaGVkX3Q6OnRpbWVzbGljZSgpIGNvbnN0CnsKICByZXR1cm4gX3RpbWVzbGljZTsKfQoK CgppbmxpbmUgdm9pZApzY2hlZF90OjpzZXRfdGltZXNsaWNlKHVuc2lnbmVkIHNob3J0IHRpbWVz bGljZSkKewogIF90aW1lc2xpY2UgPSB0aW1lc2xpY2U7Cn0KCgoKaW5saW5lIHVuc2lnbmVkIHNo b3J0CnNjaGVkX3Q6OnRpY2tzX2xlZnQoKSBjb25zdAp7CiAgcmV0dXJuIF90aWNrc19sZWZ0Owp9 CgoKCmlubGluZSB2b2lkCnNjaGVkX3Q6OnNldF90aWNrc19sZWZ0KHVuc2lnbmVkIHNob3J0IHRp Y2tzX2xlZnQpCnsKICBfdGlja3NfbGVmdCA9IHRpY2tzX2xlZnQ7Cn0KCgoKaW5saW5lIHZvaWQK c2NoZWRfdDo6cmVzZXRfY3B1dGltZSh2b2lkKQp7CiAgaWYgKENvbmZpZzo6ZmluZV9ncmFpbmVk X2NwdXRpbWUpCiAgICBfdG90YWxfY3B1dGltZSA9IDA7CiAgZWxzZQogICAgX3RvdGFsX3RpY2tz ID0gMDsKfQoKCgppbmxpbmUgdm9pZApzY2hlZF90Ojp1cGRhdGVfY3B1dGltZSh2b2lkKQp7CiAg X3RvdGFsX3RpY2tzKys7Cn0KCgoKaW5saW5lIHZvaWQKc2NoZWRfdDo6c3RhcnRfdGhyZWFkKHVu c2lnbmVkIGxvbmcgdHNjXzMyKQp7CiAgX3N0YXJ0X2NwdXRpbWUgPSB0c2NfMzI7Cn0KCgoKaW5s aW5lIHZvaWQKc2NoZWRfdDo6c3RvcF90aHJlYWQodW5zaWduZWQgbG9uZyB0c2NfMzIpCnsKICBf dG90YWxfY3B1dGltZSArPSB0c2NfMzIgLSBfc3RhcnRfY3B1dGltZTsKfQojIDExICJhdXRvL2Nv bnRleHQuaCIgMgoKIyAxICJhdXRvL2ZwdS5oIiAxCiMgMTEgImF1dG8vZnB1LmgiCmNsYXNzIHNs YWJfY2FjaGVfYW5vbjsKY2xhc3MgQ29udGV4dDsKCgoKCgoKY2xhc3MgRnB1X3N0YXRlCnsKcHVi bGljOgogIHZvaWQgYWxsb2Nfc3RhdGUoKTsKICB2b2lkIGZyZWVfc3RhdGUoKTsKICB2b2lkIHNh dmVfc3RhdGUoKTsKICB2b2lkIHJlc3RvcmVfc3RhdGUoKTsKICB2b2lkICpzdGF0ZV9idWZmZXIo KTsKCiAgRnB1X3N0YXRlKCk7CiAgfkZwdV9zdGF0ZSgpOwoKcHJpdmF0ZToKCiAgdm9pZCAqX3N0 YXRlX2J1ZmZlcjsKCnByaXZhdGU6CiAgc3RhdGljIHNsYWJfY2FjaGVfYW5vbiAqc2xhYl9hbGxv YygpOwp9OwoKY2xhc3MgRnB1CnsKcHVibGljOgoKICBzdGF0aWMgQ29udGV4dCAqb3duZXIoKTsK ICBzdGF0aWMgdm9pZCBzZXRfb3duZXIoQ29udGV4dCAqb3duZXIpOwogIHN0YXRpYyBib29sIGlz X293bmVyKENvbnRleHQgKm93bmVyKTsKCgogIHN0YXRpYyB2b2lkIGluaXQoKTsKICBzdGF0aWMg dW5zaWduZWQgY29uc3Qgc3RhdGVfc2l6ZSgpOwogIHN0YXRpYyB1bnNpZ25lZCBjb25zdCBzdGF0 ZV9hbGlnbigpOwogIHN0YXRpYyB2b2lkIGluaXRfc3RhdGUoIEZwdV9zdGF0ZSAqKTsKICBzdGF0 aWMgdm9pZCByZXN0b3JlX3N0YXRlKCBGcHVfc3RhdGUgKiApOwogIHN0YXRpYyB2b2lkIHNhdmVf c3RhdGUoIEZwdV9zdGF0ZSAqICk7CiAgc3RhdGljIHZvaWQgc3luY2hyb25pemUoKTsKICBzdGF0 aWMgdm9pZCBkaXNhYmxlKCk7CiAgc3RhdGljIHZvaWQgZW5hYmxlKCk7Cgpwcml2YXRlOgoKICBz dGF0aWMgQ29udGV4dCAqX293bmVyOwpwcml2YXRlOgoKcHJpdmF0ZToKICBzdHJ1Y3QgZnB1X3Jl Z3MKICB7CiAgICBsb25nIGN3ZDsKICAgIGxvbmcgc3dkOwogICAgbG9uZyB0d2Q7CiAgICBsb25n IGZpcDsKICAgIGxvbmcgZmNzOwogICAgbG9uZyBmb287CiAgICBsb25nIGZvczsKICAgIGxvbmcg c3Rfc3BhY2VbMjBdOwogIH07CgogIHN0cnVjdCBzc2VfcmVncwogIHsKICAgIHVuc2lnbmVkIHNo b3J0IGN3ZDsKICAgIHVuc2lnbmVkIHNob3J0IHN3ZDsKICAgIHVuc2lnbmVkIHNob3J0IHR3ZDsK ICAgIHVuc2lnbmVkIHNob3J0IGZvcDsKICAgIGxvbmcgZmlwOwogICAgbG9uZyBmY3M7CiAgICBs b25nIGZvbzsKICAgIGxvbmcgZm9zOwogICAgbG9uZyBteGNzcjsKICAgIGxvbmcgcmVzZXJ2ZWQ7 CiAgICBsb25nIHN0X3NwYWNlWzMyXTsKICAgIGxvbmcgeG1tX3NwYWNlWzMyXTsKICAgIGxvbmcg cGFkZGluZ1s1Nl07CiAgfTsKfTsKIyAxMDMgImF1dG8vZnB1LmgiCiMgMSAiYXV0by9rbWVtX3Ns YWJfc2ltcGxlLmgiIDEKCgoKCgojIDEgIi91c3IvbGliL2djYy1zbmFwc2hvdC9saWIvZ2NjLWxp Yi9pMzg2LWxpbnV4LzMuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxCiMgNyAiYXV0by9rbWVtX3NsYWJf c2ltcGxlLmgiIDIKIyAxICJhdXRvL2hlbHBpbmdfbG9jay5oIiAxCgoKCgoKCiMgMSAiYXV0by9z d2l0Y2hfbG9jay5oIiAxCgoKCgoKIyAxICJhdXRvL3N0YWNrLmgiIDEKIyAxMSAiYXV0by9zdGFj ay5oIgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBTdGFjazsKCnRlbXBsYXRlPHR5cGVuYW1l IFQ+CmNsYXNzIFN0YWNrX3RvcAp7CnByaXZhdGU6CiAgZnJpZW5kIGNsYXNzIFN0YWNrPFQ+OwoK CgogIGludCBfdmVyc2lvbjsKICBUICpfbmV4dDsKCnB1YmxpYzoKIyAzNyAiYXV0by9zdGFjay5o IgogIFN0YWNrX3RvcChpbnQgdmVyc2lvbiwgVCAqbmV4dCk7CgogIFN0YWNrX3RvcCgpOwp9OwoK dGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgU3RhY2sKewpwcml2YXRlOgogIFN0YWNrX3RvcDxU PiBfaGVhZDsKCnB1YmxpYzoKCgoKICBTdGFjaygpOwoKICBpbnQgaW5zZXJ0KFQgKmUpOwoKICBU KiBkZXF1ZXVlKCk7CgoKCiAgVCogZGVxdWV1ZShUICp0b3ApOwoKICBUKiBmaXJzdCgpOwoKICB2 b2lkIHJlc2V0KCk7Cn07CiMgOTIgImF1dG8vc3RhY2suaCIKdGVtcGxhdGU8dHlwZW5hbWUgVD4g aW5saW5lIFN0YWNrX3RvcDxUPjo6U3RhY2tfdG9wKGludCB2ZXJzaW9uLCBUICpuZXh0KQogIDog X3ZlcnNpb24gKHZlcnNpb24pLAogICAgX25leHQgKG5leHQpCnt9CgoKCnRlbXBsYXRlPHR5cGVu YW1lIFQ+IGlubGluZSBTdGFja190b3A8VD46OlN0YWNrX3RvcCgpCiAgOiBfdmVyc2lvbiAoMCks CiAgICBfbmV4dCAoMCkKe30KIyAxMTQgImF1dG8vc3RhY2suaCIKdGVtcGxhdGU8dHlwZW5hbWUg VD4gU3RhY2s8VD46OlN0YWNrKCkKICA6IF9oZWFkICgwLCAwKQp7fQoKCgp0ZW1wbGF0ZTx0eXBl bmFtZSBUPiBpbnQKU3RhY2s8VD46Omluc2VydChUICplKQp7CiAgU3RhY2tfdG9wPFQ+IG9sZF9o ZWFkLAogICAgICAgICAgICAgICAgICBuZXdfaGVhZDsKCiAgZG8gewogICAgICBvbGRfaGVhZCA9 IF9oZWFkOwogICAgICBlLT5zZXRfbmV4dChvbGRfaGVhZC5fbmV4dCk7CiAgICAgIG5ld19oZWFk Ll92ZXJzaW9uID0gb2xkX2hlYWQuX3ZlcnNpb24rMTsKICAgICAgbmV3X2hlYWQuX25leHQgPSBl OwogIH0gd2hpbGUgKCEgc21wX2NhczIoJl9oZWFkLAogICAgICAgICAgICAgICAgICAgICAgICZv bGRfaGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAmbmV3X2hlYWQpKTsKICByZXR1cm4gbmV3 X2hlYWQuX3ZlcnNpb247Cn0KCgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCoKU3RhY2s8VD46OmRl cXVldWUoKQp7CiAgU3RhY2tfdG9wPFQ+IG9sZF9oZWFkLAogICAgICAgICAgICAgICAgIG5ld19o ZWFkOwoKICBUICpmaXJzdDsKCiAgZG8gewogICAgb2xkX2hlYWQgPSBfaGVhZDsKCiAgICBmaXJz dCA9IG9sZF9oZWFkLl9uZXh0OwogICAgaWYoISBmaXJzdCkKICAgICAgYnJlYWs7CgogICAgbmV3 X2hlYWQuX25leHQgPSBmaXJzdC0+Z2V0X25leHQoKTsKICAgIG5ld19oZWFkLl92ZXJzaW9uID0g b2xkX2hlYWQuX3ZlcnNpb24gKyAxOwogIH0gd2hpbGUgKCEgc21wX2NhczIoJl9oZWFkLAogICAg ICAgICAgICAgICAgICAgICAgICZvbGRfaGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAmbmV3 X2hlYWQpKTsKCgoKCgogIHJldHVybiBmaXJzdDsKfQoKCgoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+ IFQqClN0YWNrPFQ+OjpkZXF1ZXVlKFQgKnRvcCkKewogIFN0YWNrX3RvcDxUPiBvbGRfaGVhZCwK ICAgICAgICAgICAgICAgICBuZXdfaGVhZDsKCgogIG9sZF9oZWFkLl92ZXJzaW9uID0gX2hlYWQu X3ZlcnNpb247CiAgb2xkX2hlYWQuX25leHQgPSB0b3A7CiAgaWYgKCFvbGRfaGVhZC5fbmV4dCkK ICAgIHJldHVybiAwOwoKICBuZXdfaGVhZC5fdmVyc2lvbiA9IG9sZF9oZWFkLl92ZXJzaW9uICsg MTsKICBuZXdfaGVhZC5fbmV4dCA9IHRvcC0+Z2V0X25leHQoKTsKCiAgaWYoISBzbXBfY2FzMigm X2hlYWQsCiAgICAgICAgICAgICAgICAmb2xkX2hlYWQsCiAgICAgICAgICAgICAgICAmbmV3X2hl YWQpKQoKICAgIHJldHVybiAwOwogIGVsc2UKCiAgICByZXR1cm4gdG9wOwp9CgoKCnRlbXBsYXRl PHR5cGVuYW1lIFQ+IFQqClN0YWNrPFQ+OjpmaXJzdCgpCnsKICByZXR1cm4gX2hlYWQuX25leHQ7 Cn0KCgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZApTdGFjazxUPjo6cmVzZXQoKQp7CiAgX2hl YWQuX3ZlcnNpb24gPSAwOwogIF9oZWFkLl9uZXh0ID0gMDsKfQojIDcgImF1dG8vc3dpdGNoX2xv Y2suaCIgMgoKCgoKCgpjbGFzcyBDb250ZXh0OwoKCgpjbGFzcyBTd2l0Y2hfbG9jawp7CiAgQ29u dGV4dCAqX2xvY2tfb3duZXI7CiAgU3RhY2s8Q29udGV4dD4gX2xvY2tfc3RhY2s7CgpwdWJsaWM6 CgoKCgoKICBTd2l0Y2hfbG9jaygpOwoKCgoKICBDb250ZXh0ICogbG9ja19vd25lcigpIGNvbnN0 OwoKCgoKICBib29sIHRlc3QoKSBjb25zdDsKCgoKCgogIHZvaWQgbG9jaygpOwoKCgoKICBib29s IHRlc3RfYW5kX3NldCgpOwoKCgoKCiAgdm9pZCBjbGVhcigpOwoKcHJpdmF0ZToKCgoKCgogIGJv b2wgdHJ5X2xvY2soKTsKfTsKIyA4NSAiYXV0by9zd2l0Y2hfbG9jay5oIgppbmxpbmUgU3dpdGNo X2xvY2s6OlN3aXRjaF9sb2NrKCkKICA6IF9sb2NrX293bmVyKDApCnsKfQoKCgoKCgppbmxpbmUg Q29udGV4dCAqClN3aXRjaF9sb2NrOjpsb2NrX293bmVyKCkgY29uc3QKewogIHJldHVybiBfbG9j a19vd25lcjsKfQoKCgoKCgppbmxpbmUgYm9vbApTd2l0Y2hfbG9jazo6dGVzdCgpIGNvbnN0CnsK ICByZXR1cm4gX2xvY2tfb3duZXI7Cn0KIyA4ICJhdXRvL2hlbHBpbmdfbG9jay5oIiAyCiMgMTkg ImF1dG8vaGVscGluZ19sb2NrLmgiCmNsYXNzIEhlbHBpbmdfbG9jawp7CiAgU3dpdGNoX2xvY2sg X3N3aXRjaF9sb2NrOwoKcHVibGljOgogIHN0YXRpYyBib29sIHRocmVhZGluZ19zeXN0ZW1fYWN0 aXZlOwoKcHVibGljOgoKCgogIGJvb2wgdGVzdF9hbmRfc2V0KCk7CgoKCgoKICB2b2lkIGxvY2so KTsKCgoKCiAgYm9vbCB0ZXN0KCk7CgoKCgoKICB2b2lkIGNsZWFyKCk7CgoKCgogIENvbnRleHQq IGxvY2tfb3duZXIoKTsKfTsKCnR5cGVkZWYgTG9ja19ndWFyZDxIZWxwaW5nX2xvY2s+IEhlbHBp bmdfbG9ja19ndWFyZDsKIyA2NyAiYXV0by9oZWxwaW5nX2xvY2suaCIKaW5saW5lIGJvb2wKSGVs cGluZ19sb2NrOjp0ZXN0KCkKewogIHJldHVybiBfc3dpdGNoX2xvY2sudGVzdCgpOwp9CgoKCgoK CmlubGluZSBDb250ZXh0KgpIZWxwaW5nX2xvY2s6OmxvY2tfb3duZXIoKQp7CiAgcmV0dXJuIF9z d2l0Y2hfbG9jay5sb2NrX293bmVyKCk7Cn0KIyA4ICJhdXRvL2ttZW1fc2xhYl9zaW1wbGUuaCIg MgoKIyAxICJhdXRvL3NsYWJfY2FjaGVfYW5vbi5oIiAxCiMgMTQgImF1dG8vc2xhYl9jYWNoZV9h bm9uLmgiCmNsYXNzIHNsYWJfY2FjaGVfYW5vbgp7CnByb3RlY3RlZDoKICBmcmllbmQgY2xhc3Mg c2xhYjsKCgoKCiAgdmlydHVhbCB2b2lkICpibG9ja19hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUs IHVuc2lnbmVkIGxvbmcgYWxpZ25tZW50KSA9IDA7CiAgdmlydHVhbCB2b2lkIGJsb2NrX2ZyZWUo dm9pZCAqYmxvY2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSkgPSAwOwoKcHJpdmF0ZToKICBzbGFiX2Nh Y2hlX2Fub24oKTsKICBzbGFiX2NhY2hlX2Fub24oY29uc3Qgc2xhYl9jYWNoZV9hbm9uJik7CiMg MzcgImF1dG8vc2xhYl9jYWNoZV9hbm9uLmgiCiAgc2xhYiAqX2ZpcnN0X3NsYWIsICpfZmlyc3Rf YXZhaWxhYmxlX3NsYWIsICpfbGFzdF9zbGFiOwogIHVuc2lnbmVkIGxvbmcgX3NsYWJfc2l6ZTsK ICB1bnNpZ25lZCBfZWxlbV9zaXplLCBfbGF0ZXN0X29mZnNldCwgX2FsaWdubWVudDsKCnB1Ymxp YzoKCgoKICBzbGFiX2NhY2hlX2Fub24odW5zaWduZWQgbG9uZyBzbGFiX3NpemUsIHVuc2lnbmVk IGVsZW1fc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KTsKCiAgdmlydHVhbCB+c2xhYl9jYWNoZV9h bm9uKCk7CgogIHZpcnR1YWwgdm9pZCAqIGFsbG9jKCk7CgogIHZpcnR1YWwgdm9pZCBmcmVlKHZv aWQgKmNhY2hlX2VudHJ5KTsKCiAgdmlydHVhbCBib29sIHJlYXAoKTsKCnByb3RlY3RlZDoKICB2 b2lkIGRlc3Ryb3koKTsKCgogIHZpcnR1YWwgdm9pZCBlbGVtX2N0b3Iodm9pZCAqKTsKCiAgdmly dHVhbCB2b2lkIGVsZW1fZHRvcih2b2lkICopOwp9OwojIDEwICJhdXRvL2ttZW1fc2xhYl9zaW1w bGUuaCIgMgoKCgoKCgpjbGFzcyBrbWVtX3NsYWJfc2ltcGxlX3QgOiBwdWJsaWMgc2xhYl9jYWNo ZV9hbm9uCnsKCiAgSGVscGluZ19sb2NrIF9sb2NrOwoKcHVibGljOgoKICBrbWVtX3NsYWJfc2lt cGxlX3QodW5zaWduZWQgZWxlbV9zaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQpOwoKICB+a21lbV9z bGFiX3NpbXBsZV90KCk7CgoKICB2b2lkICogYWxsb2MoKTsKCiAgdm9pZCBmcmVlKHZvaWQgKmNh Y2hlX2VudHJ5KTsKCiAgYm9vbCByZWFwKCk7CgoKICB2b2lkICogb3BlcmF0b3IgbmV3KHNpemVf dCBzaXplKTsKCiAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqYmxvY2ssIHNpemVfdCBzaXpl KTsKCnByb3RlY3RlZDoKCgogIGttZW1fc2xhYl9zaW1wbGVfdCh1bnNpZ25lZCBsb25nIHNsYWJf c2l6ZSwgdW5zaWduZWQgZWxlbV9zaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQpOwoKcHJpdmF0ZToK CgogIHZpcnR1YWwgdm9pZCAqIGJsb2NrX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWdu ZWQgbG9uZyk7CgogIHZpcnR1YWwgdm9pZCBibG9ja19mcmVlKHZvaWQgKmJsb2NrLCB1bnNpZ25l ZCBsb25nKTsKfTsKIyAxMDQgImF1dG8vZnB1LmgiIDIKCgojIDEgIi4uL3NyYy9saWIvbWluaWxp YmMvaW5jbHVkZS9jc3RyaW5nIiAxCgoKCgoKIyAxICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1 ZGUvc3RyaW5nLmgiIDEKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLXNuYXBzaG90L2xpYi9nY2MtbGli L2kzODYtbGludXgvMy4zL2luY2x1ZGUvc3RkZGVmLmgiIDEKIyA2ICIuLi9zcmMvbGliL21pbmls aWJjL2luY2x1ZGUvc3RyaW5nLmgiIDIKCmV4dGVybiAiQyIgewoKY2hhciAqc3RyY3B5KGNoYXIg KmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CmNoYXIgKnN0cm5jcHkoY2hhciAqZGVzdCwgY29uc3Qg Y2hhciAqc3JjLCBzaXplX3Qgbik7Cgp2b2lkICptZW1jY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZv aWQgKnNyYywgaW50IGMsIHNpemVfdCBuKTsKdm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0 IHZvaWQgKnNyYywgc2l6ZV90IG4pOwp2b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZv aWQgKnNyYywgc2l6ZV90IG4pOwoKaW50IG1lbWNjbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZv aWQgKnMyLCBpbnQgYywgc2l6ZV90IG4pOwppbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25z dCB2b2lkICpzMiwgc2l6ZV90IG4pOwppbnQgc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBj aGFyICpzMik7CmludCBzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6 ZV90IG4pOwoKaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsK aW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4p OwoKc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICpzKTsKCmNoYXIgKnN0cnN0cihjb25zdCBjaGFy ICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKTsKCmNoYXIgKnN0cmR1cChjb25zdCBjaGFy ICpzKTsKCmNoYXIgKnN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYyk7CmNoYXIgKnN0cnJjaHIo Y29uc3QgY2hhciAqcywgaW50IGMpOwoKY2hhciAqc3RyY2F0KGNoYXIgKmRlc3QsIGNvbnN0IGNo YXIgKnNyYyk7CmNoYXIgKnN0cm5jYXQoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXpl X3Qgbik7CgpzaXplX3Qgc3Ryc3BuKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKl9hY2NlcHQp OwpzaXplX3Qgc3RyY3Nwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpyZWplY3QpOwoKY2hh ciAqc3RycGJyayhjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpfYWNjZXB0KTsKY2hhciAqc3Ry c2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSk7Cgp2b2lkKiBtZW1zZXQodm9p ZCAqcywgaW50IGMsIHNpemVfdCBuKTsKdm9pZCogbWVtY2hyKGNvbnN0IHZvaWQgKnMsIGludCBj LCBzaXplX3Qgbik7CgppbnQgc3RyY29sbChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIp OwoKCn0KIyA3ICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1ZGUvY3N0cmluZyIgMgoKCm5hbWVz cGFjZSBzdGQgewoKCgoKCgogIHVzaW5nIDo6bWVtY3B5OwogIHVzaW5nIDo6bWVtY2NweTsKICB1 c2luZyA6Om1lbW1vdmU7CiAgdXNpbmcgOjptZW1jY21wOwogIHVzaW5nIDo6bWVtY21wOwogIHVz aW5nIDo6bWVtc2V0OwogIHVzaW5nIDo6bWVtY2hyOwoKCiAgdXNpbmcgOjpzdHJjcHk7CiAgdXNp bmcgOjpzdHJuY3B5OwogIHVzaW5nIDo6c3RyY2F0OwogIHVzaW5nIDo6c3RybmNhdDsKICB1c2lu ZyA6OnN0cmNtcDsKICB1c2luZyA6OnN0cm5jbXA7CiAgdXNpbmcgOjpzdHJsZW47CiAgdXNpbmcg OjpzdHJzcG47CiAgdXNpbmcgOjpzdHJjc3BuOwogIHVzaW5nIDo6c3RyY29sbDsKCgogIHVzaW5n IDo6c3RycGJyazsKICB1c2luZyA6OnN0cnJjaHI7CiAgdXNpbmcgOjpzdHJjaHI7CiAgdXNpbmcg OjpzdHJzdHI7CgoKCgoKICBpbmxpbmUgY2hhcioKICBzdHJwYnJrKGNoYXIqIF9fczEsIGNvbnN0 IGNoYXIqIF9fczIpCiAgeyByZXR1cm4gX19idWlsdGluX3N0cnBicmsoY29uc3RfY2FzdDxjb25z dCBjaGFyKj4oX19zMSksIF9fczIpOyB9CgoKCiAgaW5saW5lIGNoYXIqCiAgc3RycmNocihjaGFy KiBfX3MxLCBpbnQgX19uKQogIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJyY2hyKGNvbnN0X2Nhc3Q8 Y29uc3QgY2hhcio+KF9fczEpLCBfX24pOyB9CgoKCiAgaW5saW5lIGNoYXIqCiAgc3RyY2hyKGNo YXIqIF9fczEsIGludCBfX24pCiAgeyByZXR1cm4gX19idWlsdGluX3N0cmNocihjb25zdF9jYXN0 PGNvbnN0IGNoYXIqPihfX3MxKSwgX19uKTsgfQoKCgogIGlubGluZSBjaGFyKgogIHN0cnN0cihj aGFyKiBfX3MxLCBjb25zdCBjaGFyKiBfX3MyKQogIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJzdHIo Y29uc3RfY2FzdDxjb25zdCBjaGFyKj4oX19zMSksIF9fczIpOyB9CgoKCn07CiMgMTA3ICJhdXRv L2ZwdS5oIiAyCiMgMSAiYXV0by9jcHUuaCIgMQojIDE2ICJhdXRvL2NwdS5oIgpjbGFzcyBDcHUK ewpwdWJsaWM6CgogIGVudW0gVmVuZG9yIHsKICAgIFZFTkRPUl9VTktOT1dOID0gMCwKICAgIFZF TkRPUl9JTlRFTCwKICAgIFZFTkRPUl9BTUQsCiAgICBWRU5ET1JfQ1lSSVgsCiAgICBWRU5ET1Jf SURULAogICAgVkVORE9SX1VNQywKICAgIFZFTkRPUl9ORVhHRU4sCiAgICBWRU5ET1JfUklTRSwK ICAgIFZFTkRPUl9UUkFOU01FVEEsCiAgfTsKCiAgc3RhdGljIGNvbnN0IGNoYXIgKiB2ZW5kb3Jf c3RyKCk7CiAgc3RhdGljIGNvbnN0IGNoYXIgKiBtb2RlbF9zdHIoKTsKICBzdGF0aWMgY29uc3Qg Q3B1OjpWZW5kb3IgdmVuZG9yKCk7CiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBmYW1pbHko KTsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1vZGVsKCk7CiAgc3RhdGljIGNvbnN0IHVu c2lnbmVkIGludCBzdGVwcGluZygpOwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXBpYygp OwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZmVhdHVyZXMoKTsKICBzdGF0aWMgdm9pZCBp ZGVudGlmeSgpOwogIHN0YXRpYyB2b2lkIHNldF9zeXNlbnRlcl9zdGFjayAodW5zaWduZWQgc3Rh Y2twdHIpOwoKcHJpdmF0ZToKCiAgc3RydWN0IFZlbmRvcl90YWJsZSB7CiAgICB1bnNpZ25lZCB2 ZW5kb3JfbWFzazsKICAgIHVuc2lnbmVkIHZlbmRvcl9jb2RlOwogICAgY29uc3QgY2hhciAqdmVu ZG9yX3N0cmluZzsKICB9OwoKICBzdGF0aWMgdW5zaWduZWQgY3B1X3N5c2VudGVyX3N0YWNrIGFz bSAoIkNQVV9TWVNFTlRFUl9TVEFDSyIpOwogIHN0YXRpYyB1bnNpZ25lZCBjcHVfdmVyc2lvbjsK ICBzdGF0aWMgdW5zaWduZWQgY3B1X2FwaWM7CiAgc3RhdGljIHVuc2lnbmVkIGNwdV9mZWF0dXJl czsKICBzdGF0aWMgVmVuZG9yIGNwdV92ZW5kb3I7CiAgc3RhdGljIGNoYXIgY3B1X3ZlbmRvcl9z dHJbMTNdOwogIHN0YXRpYyBjb25zdCBjaGFyICogY3B1X21vZGVsX3N0cjsKCiAgc3RhdGljIFZl bmRvcl90YWJsZSBpbnRlbF90YWJsZVtdOwogIHN0YXRpYyBWZW5kb3JfdGFibGUgYW1kX3RhYmxl W107CiAgc3RhdGljIFZlbmRvcl90YWJsZSBjeXJpeF90YWJsZVtdOwogIHN0YXRpYyBWZW5kb3Jf dGFibGUgaWR0X3RhYmxlW107CgogIHN0YXRpYyBjb25zdCBjaGFyICogbG9va3VwX21vZGVsX3N0 ciAoY29uc3QgQ3B1OjpWZW5kb3IgdmVuZG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCB2ZXJzaW9uKTsKCiAgc3RhdGljIHZvaWQgd3Jt c3IgKHVuc2lnbmVkIGVjeCwgdW5zaWduZWQgZWF4LCB1bnNpZ25lZCBlZHgpOwogIHN0YXRpYyB2 b2lkIGNwdWlkICh1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCAqZWF4LCB1bnNpZ25lZCAqZWJ4LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmVj eCwgdW5zaWduZWQgKmVkeCk7CnByaXZhdGU6CgpwdWJsaWM6CiAgZW51bSBMYnIKICAgIHsKICAg ICAgTEJSX1VOSU5JVElBTElaRUQgPSAwLAogICAgICBMQlJfTk9ORSwKICAgICAgTEJSX1A2LAog ICAgICBMQlJfUDQsCiAgICB9OwoKcHJpdmF0ZToKICBzdGF0aWMgTGJyIGNwdV9sYnI7CgpwdWJs aWM6CiAgc3RhdGljIGNvbnN0IENwdTo6TGJyIGhhc19sYnIoKTsKCiAgc3RhdGljIHZvaWQgaW5p dCh2b2lkKTsKCnByaXZhdGU6CiAgc3RhdGljIHZvaWQgYm9jaHNfdHdlYWtzKCk7Cn07CiMgMTA1 ICJhdXRvL2NwdS5oIgppbmxpbmUgdm9pZApDcHU6OndybXNyKHVuc2lnbmVkIGVjeCwgdW5zaWdu ZWQgZWF4LCB1bnNpZ25lZCBlZHgpCnsKICBhc20gdm9sYXRpbGUgKCJ3cm1zciIgOiA6ICJjIihl Y3gpLCAiYSIoZWF4KSwgImQiKGVkeCkpOwp9CgoKCmlubGluZSB2b2lkCkNwdTo6Y3B1aWQodW5z aWduZWQgbW9kZSwKICAgICAgICAgICAgdW5zaWduZWQgKmVheCwgdW5zaWduZWQgKmVieCwgdW5z aWduZWQgKmVjeCwgdW5zaWduZWQgKmVkeCkKewogIGFzbSB2b2xhdGlsZSAoImNwdWlkIiA6ICI9 YSIoKmVheCksICI9YiIoKmVieCksICI9YyIoKmVjeCksICI9ZCIoKmVkeCkKICAgICAgICAgICAg ICAgICAgICAgICAgOiAiYSIobW9kZSkpOwp9CgoKCmlubGluZSB2b2lkCkNwdTo6c2V0X3N5c2Vu dGVyX3N0YWNrKHVuc2lnbmVkIHN0YWNrcHRyKQp7CiAgY3B1X3N5c2VudGVyX3N0YWNrID0gc3Rh Y2twdHI7Cn0KCgoKaW5saW5lIGNvbnN0IGNoYXIgKgpDcHU6OnZlbmRvcl9zdHIoKQp7CiAgcmV0 dXJuIGNwdV92ZW5kb3Jfc3RyOwp9CgoKCmlubGluZSBjb25zdCBjaGFyICoKQ3B1Ojptb2RlbF9z dHIoKQp7CiAgcmV0dXJuIGNwdV9tb2RlbF9zdHI7Cn0KCgoKaW5saW5lIGNvbnN0IENwdTo6VmVu ZG9yCkNwdTo6dmVuZG9yKCkKewogIHJldHVybiBjcHVfdmVuZG9yOwp9CgoKCmlubGluZSBjb25z dCB1bnNpZ25lZCBpbnQKQ3B1OjpmYW1pbHkoKQp7CiAgcmV0dXJuIChjcHVfdmVyc2lvbiA+PiA4 KSAmIDB4RjsKfQoKCgppbmxpbmUgY29uc3QgdW5zaWduZWQgaW50CkNwdTo6bW9kZWwoKQp7CiAg cmV0dXJuIChjcHVfdmVyc2lvbiA+PiA0KSAmIDB4RjsKfQoKCgppbmxpbmUgY29uc3QgdW5zaWdu ZWQgaW50CkNwdTo6c3RlcHBpbmcoKQp7CiAgcmV0dXJuIGNwdV92ZXJzaW9uICYgMHhGOwp9CgoK CmlubGluZSBjb25zdCB1bnNpZ25lZCBpbnQKQ3B1OjphcGljKCkKewogIHJldHVybiAoY3B1X2Fw aWMgPj4gMjQpICYgMHhGRjsKfQoKCgppbmxpbmUgY29uc3QgdW5zaWduZWQgaW50CkNwdTo6ZmVh dHVyZXMoKQp7CiAgcmV0dXJuIGNwdV9mZWF0dXJlczsKfQojIDEwOCAiYXV0by9mcHUuaCIgMgoj IDEgIi4uL3NyYy9rZXJuL2lhMzIvcmVnZGVmcy5oIiAxCiMgMTA5ICJhdXRvL2ZwdS5oIiAyCiMg MTE3ICJhdXRvL2ZwdS5oIgppbmxpbmUgRnB1X3N0YXRlOjpGcHVfc3RhdGUoKSA6IF9zdGF0ZV9i dWZmZXIoMCkKe30KCgoKaW5saW5lIEZwdV9zdGF0ZTo6fkZwdV9zdGF0ZSgpCnsKICBmcmVlX3N0 YXRlKCk7Cn0KCgoKaW5saW5lIHZvaWQgKkZwdV9zdGF0ZTo6c3RhdGVfYnVmZmVyKCkKewogIHJl dHVybiBfc3RhdGVfYnVmZmVyOwp9CgoKCmlubGluZSB2b2lkIEZwdV9zdGF0ZTo6c2F2ZV9zdGF0 ZSgpCnsKICBGcHU6OnNhdmVfc3RhdGUodGhpcyk7Cn0KCgoKaW5saW5lIHZvaWQgRnB1X3N0YXRl OjpyZXN0b3JlX3N0YXRlKCkKewogIEZwdTo6cmVzdG9yZV9zdGF0ZSh0aGlzKTsKfQoKCgppbmxp bmUgQ29udGV4dCAqIEZwdTo6b3duZXIoKQp7CiAgcmV0dXJuIF9vd25lcjsKfQoKCgppbmxpbmUg dm9pZCBGcHU6OnNldF9vd25lcihDb250ZXh0ICpvd25lcikKewogIF9vd25lciA9IG93bmVyOwp9 CgoKCmlubGluZSBib29sIEZwdTo6aXNfb3duZXIoQ29udGV4dCAqb3duZXIpCnsKICByZXR1cm4g X293bmVyID09IG93bmVyOwp9CgoKCgoKCmlubGluZSB2b2lkIEZwdTo6c2F2ZV9zdGF0ZSggRnB1 X3N0YXRlICpzICkKewogICgodm9pZCkgKChzLT5zdGF0ZV9idWZmZXIoKSkgPyAwIDogKF9fYXNz ZXJ0X2ZhaWwgKCJzLT5zdGF0ZV9idWZmZXIoKSIsICJhdXRvL2ZwdS5oIiwgMTc2LCAoKGNvbnN0 IGNoYXIgKikgMCkpLCAwKSkpOwoKICBpZiAoKENwdTo6ZmVhdHVyZXMoKSAmIDB4MDEwMDAwMDAp KQogICAgYXNtIHZvbGF0aWxlICgiZnhzYXZlICglMCkiIDogOiAiciIgKHMtPnN0YXRlX2J1ZmZl cigpKSA6ICJtZW1vcnkiKTsKICBlbHNlCiAgICBhc20gdm9sYXRpbGUgKCJmbnNhdmUgKCUwKSIg OiA6ICJyIiAocy0+c3RhdGVfYnVmZmVyKCkpIDogIm1lbW9yeSIpOwp9CgoKCgoKCmlubGluZSB2 b2lkIEZwdTo6cmVzdG9yZV9zdGF0ZSggRnB1X3N0YXRlICpzICkKewogICgodm9pZCkgKChzLT5z dGF0ZV9idWZmZXIoKSkgPyAwIDogKF9fYXNzZXJ0X2ZhaWwgKCJzLT5zdGF0ZV9idWZmZXIoKSIs ICJhdXRvL2ZwdS5oIiwgMTkxLCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwoKICBpZiAoKENw dTo6ZmVhdHVyZXMoKSAmIDB4MDEwMDAwMDApKQogICAgYXNtIHZvbGF0aWxlICgiZnhyc3RvciAo JTApIiA6IDogInIiIChzLT5zdGF0ZV9idWZmZXIoKSkpOwogIGVsc2UKICAgIGFzbSB2b2xhdGls ZSAoImZyc3RvciAgKCUwKSIgOiA6ICJyIiAocy0+c3RhdGVfYnVmZmVyKCkpKTsKfQojIDIwNiAi YXV0by9mcHUuaCIKaW5saW5lIHZvaWQgRnB1Ojppbml0X3N0YXRlKCBGcHVfc3RhdGUgKnMgKQp7 CiAgaWYgKChDcHU6OmZlYXR1cmVzKCkgJiAweDAxMDAwMDAwKSkgewoKICAgIHNzZV9yZWdzICpz c2UgPSAoc3NlX3JlZ3MgKikgcy0+c3RhdGVfYnVmZmVyKCk7CgogICAgbWVtc2V0IChzc2UsIDAs IHNpemVvZiAoKnNzZSkpOwogICAgc3NlLT5jd2QgPSAweDM3ZjsKCiAgICBpZiAoKENwdTo6ZmVh dHVyZXMoKSAmIDB4MDIwMDAwMDApICYmIChDcHU6OmZlYXR1cmVzKCkgJiAweDA0MDAwMDAwKSkK ICAgICAgc3NlLT5teGNzciA9IDB4MWY4MDsKCiAgfSBlbHNlIHsKCiAgICBmcHVfcmVncyAqZnB1 ID0gKGZwdV9yZWdzICopIHMtPnN0YXRlX2J1ZmZlcigpOwoKICAgIG1lbXNldCAoZnB1LCAwLCBz aXplb2YgKCpmcHUpKTsKICAgIGZwdS0+Y3dkID0gMHhmZmZmMDM3ZjsKICAgIGZwdS0+c3dkID0g MHhmZmZmMDAwMDsKICAgIGZwdS0+dHdkID0gMHhmZmZmZmZmZjsKICAgIGZwdS0+Zm9zID0gMHhm ZmZmMDAwMDsKICB9Cn0KCgoKaW5saW5lIHVuc2lnbmVkIGNvbnN0IEZwdTo6c3RhdGVfc2l6ZSgp CnsKICByZXR1cm4gKENwdTo6ZmVhdHVyZXMoKSAmIDB4MDEwMDAwMDApID8gc2l6ZW9mIChzc2Vf cmVncykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAo ZnB1X3JlZ3MpOwp9CgoKCmlubGluZSB1bnNpZ25lZCBjb25zdCBGcHU6OnN0YXRlX2FsaWduKCkK ewogIHJldHVybiAoQ3B1OjpmZWF0dXJlcygpICYgMHgwMTAwMDAwMCkgPyAxNiA6IDQ7Cn0KCgoK CgoKCmlubGluZSB2b2lkIEZwdTo6c3luY2hyb25pemUoKQp7CiAgYXNtIHZvbGF0aWxlICgiZndh aXQiKTsKfQoKCgoKCgppbmxpbmUgdm9pZCBGcHU6OmRpc2FibGUoKQp7CiAgVW5zaWduZWQzMiBk dW1teTsKCiAgYXNtIHZvbGF0aWxlICgibW92bCAlJWNyMCwgJTA7IG9ybCAlMSwgJTA7IG1vdmwg JTAsICUlY3IwIgogICAgICAgICAgICAgICAgOiAiPXIiIChkdW1teSkKICAgICAgICAgICAgICAg IDogImkiICgweDAwMDAwMDA4KSk7Cn0KCgoKCgoKaW5saW5lIHZvaWQgRnB1OjplbmFibGUoKQp7 CiAgYXNtIHZvbGF0aWxlICgiY2x0cyIpOwp9CiMgMTMgImF1dG8vY29udGV4dC5oIiAyCgoKCgoK CmNsYXNzIFNwYWNlX2NvbnRleHQ7CmNsYXNzIFRocmVhZF9sb2NrOwpjbGFzcyBSZXR1cm5fZnJh bWU7CgoKCgoKY2xhc3MgQ29udGV4dAp7CnB1YmxpYzoKICBzdGF0aWMgY29uc3Qgdm1fc2l6ZV90 IHNpemUgPSBDb25maWc6OnRocmVhZF9ibG9ja19zaXplOwoKcHJpdmF0ZToKCiAgdm9pZCBzd2l0 Y2hpbl9jb250ZXh0KCkgYXNtKCJjYWxsX3N3aXRjaGluX2NvbnRleHQiKTsKCiAgZnJpZW5kIGNs YXNzIGpkYjsKICBmcmllbmQgY2xhc3MgamRiX3RidWY7CgoKCgogICAgICAgICAgICAgdW5zaWdu ZWQgX3N0YXRlOwoKCnByb3RlY3RlZDoKICAgICAgICAgICAgIENvbnRleHQgKnJlYWR5X25leHQ7 CiAgICAgICAgICAgICBDb250ZXh0ICpyZWFkeV9wcmV2OwogICAgICAgICAgICAgTXdvcmQgKmtl cm5lbF9zcDsKCnByaXZhdGU6CiAgICAgICAgICAgICBTcGFjZV9jb250ZXh0KiBfc3BhY2VfY29u dGV4dDsKCiAgQ29udGV4dCogX3N0YWNrX2xpbms7CgogIENvbnRleHQqIF9kb25hdGVlOwoKCgoK CiAgaW50IF9sb2NrX2NudDsKICBUaHJlYWRfbG9jayogY29uc3QgX3RocmVhZF9sb2NrOwoKCgoK ICBzY2hlZF90IF9zY2hlZDsKCgogIEZwdV9zdGF0ZSBfZnB1X3N0YXRlOwoKCnByb3RlY3RlZDoK ICBzdGF0aWMgQ29udGV4dCAqcHJpb19maXJzdFsyNTZdIGFzbSAoIkNPTlRFWFRfUFJJT19GSVJT VCIpOwogIHN0YXRpYyBDb250ZXh0ICpwcmlvX25leHRbMjU2XSBhc20gKCJDT05URVhUX1BSSU9f TkVYVCIpOwogIHN0YXRpYyB1bnNpZ25lZCBwcmlvX2hpZ2hlc3QgYXNtICgiQ09OVEVYVF9QUklP X0hJR0hFU1QiKTsKICBzdGF0aWMgaW50IHRpbWVzbGljZV90aWNrc19sZWZ0OwogIHN0YXRpYyBD b250ZXh0ICp0aW1lc2xpY2Vfb3duZXI7CgpwdWJsaWM6CiMgODkgImF1dG8vY29udGV4dC5oIgog IENvbnRleHQoVGhyZWFkX2xvY2sgKnRocmVhZF9sb2NrLCBTcGFjZV9jb250ZXh0KiBzcGFjZV9j b250ZXh0KTsKCgoKICB2aXJ0dWFsIH5Db250ZXh0KCk7CgoKCgogIHVuc2lnbmVkIHN0YXRlKCkg Y29uc3Q7CgoKCgogIGJvb2wgZXhpc3RzKCkgY29uc3Q7CgoKCgoKICBib29sIHN0YXRlX2FkZCh1 bnNpZ25lZCBiaXRzKTsKCgoKCgogIGJvb2wgc3RhdGVfZGVsKHVuc2lnbmVkIGJpdHMpOwoKCgoK CgoKICBib29sIHN0YXRlX2NoYW5nZSh1bnNpZ25lZCBtYXNrLCB1bnNpZ25lZCBiaXRzKTsKIyAx MzYgImF1dG8vY29udGV4dC5oIgogIGJvb2wgc3RhdGVfY2hhbmdlX3NhZmVseSh1bnNpZ25lZCBt YXNrLCB1bnNpZ25lZCBiaXRzKTsKCgoKCgoKCiAgdm9pZCBzdGF0ZV9jaGFuZ2VfZGlydHkodW5z aWduZWQgbWFzaywgdW5zaWduZWQgYml0cyk7CgoKCgoKICBTcGFjZV9jb250ZXh0ICogc3BhY2Vf Y29udGV4dCgpIGNvbnN0OwoKCgoKICBUaHJlYWRfbG9jayAqIHRocmVhZF9sb2NrKCk7CgoKCgog IHNjaGVkX3QgKiBzY2hlZCgpOwoKCgoKICBSZXR1cm5fZnJhbWUgKnJlZ3MoKSBjb25zdDsKCgoK ICB2b2lkIGluY19sb2NrX2NudCgpOwoKCgoKICB2b2lkIGRlY19sb2NrX2NudCgpOwoKCgoKICBp bnQgbG9ja19jbnQoKTsKCgoKCgoKICB2b2lkIHNjaGVkdWxlKCk7CgoKICBzdGF0aWMgdm9pZCB0 aW1lcl90aWNrKCk7CgoKCgogIGJvb2wgaW5fcmVhZHlfbGlzdCgpOwoKCgogIHZvaWQgcmVhZHlf ZW5xdWV1ZSgpOwoKCgogIHZvaWQgcmVhZHlfZGVxdWV1ZSgpOwoKCgoKCgoKICBDb250ZXh0ICog Z2V0X25leHQoKTsKCgoKCiAgdm9pZCBzZXRfbmV4dChDb250ZXh0ICpuZXh0KTsKCgoKCgoKICBD b250ZXh0KiBkb25hdGVlKCk7CgogIHZvaWQgc2V0X2RvbmF0ZWUoQ29udGV4dCogZG9uYXRlZSk7 CgogIHZvaWQgc2V0X2tlcm5lbF9zcChNd29yZCAqZXNwKTsKCiAgRnB1X3N0YXRlICpjb25zdCBm cHVfc3RhdGUoKTsKIyAyMzcgImF1dG8vY29udGV4dC5oIgogIGJvb2wgc3dpdGNoX3RvKENvbnRl eHQgKnQpOwoKCgoKICB2b2lkIGhhbmRsZV9mcHVfdHJhcCgpOwp9OwoKCgoKCmV4dGVybiAiQyIg dm9pZCB0aHJlYWRfaGFuZGxlX2ZwdXRyYXAoKTsKIyAyNjIgImF1dG8vY29udGV4dC5oIgojIDEg ImF1dG8vZW50cnlfZnJhbWUuaCIgMQojIDIxICJhdXRvL2VudHJ5X2ZyYW1lLmgiCmNsYXNzIFN5 c2NhbGxfZnJhbWUKewpwcml2YXRlOgoKcHVibGljOgoKICBVbnNpZ25lZDMyIGVjeDsKICBVbnNp Z25lZDMyIGVkeDsKICBVbnNpZ25lZDMyIGVzaTsKICBVbnNpZ25lZDMyIGVkaTsKICBVbnNpZ25l ZDMyIGVieDsKICBVbnNpZ25lZDMyIGVicDsKICBVbnNpZ25lZDMyIGVheDsKfTsKCmNsYXNzIFJl dHVybl9mcmFtZQp7CnByaXZhdGU6CgpwdWJsaWM6CiAgVW5zaWduZWQzMiBlaXA7CiAgVW5zaWdu ZWQxNiBjcywgX19jc3U7CiAgVW5zaWduZWQzMiBlZmxhZ3M7CiAgVW5zaWduZWQzMiBlc3A7CiAg VW5zaWduZWQxNiBzcywgX19zc3U7Cgp9OwoKCgoKCgoKY2xhc3MgRW50cnlfZnJhbWUgOiBwdWJs aWMgU3lzY2FsbF9mcmFtZSwgcHVibGljIFJldHVybl9mcmFtZQp7Cn07CgoKCgpjbGFzcyBTeXNf aXBjX2ZyYW1lIDogcHVibGljIFN5c2NhbGxfZnJhbWUKewpwdWJsaWM6CgogIHZvaWQgcmN2X3Nv dXJjZSggTDRfdWlkIGlkICk7CgoKICBMNF91aWQgcmN2X3NvdXJjZSgpOwoKCiAgTDRfdWlkIHNu ZF9kZXN0KCkgY29uc3Q7CgoKICBNd29yZCBoYXNfc25kX2Rlc3QoKSBjb25zdDsKCgogIE13b3Jk IGlycSgpIGNvbnN0OwoKCiAgdm9pZCBzbmRfZGVzYyggTXdvcmQgdyApOwoKCiAgTDRfc25kX2Rl c2Mgc25kX2Rlc2MoKSBjb25zdDsKCgogIHZvaWQgcmN2X2Rlc2MoIE13b3JkIHcgKTsKCgogIEw0 X3Jjdl9kZXNjIHJjdl9kZXNjKCkgY29uc3Q7CgoKICBMNF90aW1lb3V0IHRpbWVvdXQoKSBjb25z dDsKCgogIE13b3JkIG1zZzAoKSBjb25zdDsKCgogIE13b3JkIG1zZzEoKSBjb25zdDsKCgogIHZv aWQgbXNnMCggTXdvcmQgdyApOwoKCiAgdm9pZCBtc2cxKCBNd29yZCB3ICk7CgoKICB2b2lkIGNv cHlfbXNnKCBTeXNfaXBjX2ZyYW1lICp0byApIGNvbnN0IDsKCgogIE13b3JkIG1zZ19kb3BlKCkg Y29uc3Q7CgoKICB2b2lkIG1zZ19kb3BlKCBNd29yZCBkICk7CgoKICB2b2lkIG1zZ19kb3BlX29y KCBNd29yZCBkICk7Cn07CgoKCgpjbGFzcyBTeXNfaWRfbmVhcmVzdF9mcmFtZSA6IHB1YmxpYyBT eXNjYWxsX2ZyYW1lCnsKcHVibGljOgoKCiAgTDRfdWlkIGRlc3QoKSBjb25zdDsKCgogIHZvaWQg bmVhcmVzdCggTDRfdWlkIGlkICkgOwp9OwoKCgoKY2xhc3MgU3lzX2V4X3JlZ3NfZnJhbWUgOiBw dWJsaWMgU3lzY2FsbF9mcmFtZQp7CnB1YmxpYzoKCgogIE13b3JkIGx0aHJlYWQoKSBjb25zdDsK CgogIE13b3JkIHNwKCkgY29uc3Q7CgoKICBNd29yZCBpcCgpIGNvbnN0OwoKCiAgTDRfdWlkIHBy ZWVtcHRlcigpIGNvbnN0OwoKCiAgTDRfdWlkIHBhZ2VyKCkgY29uc3Q7CgoKICB2b2lkIG9sZF9l ZmxhZ3MoIE13b3JkIG9lZmwgKTsKCgogIHZvaWQgb2xkX3NwKCBNd29yZCBvc3AgKTsKCgogIHZv aWQgb2xkX2lwKCBNd29yZCBvaXAgKTsKCgogIHZvaWQgb2xkX3ByZWVtcHRlciggTDRfdWlkIGlk ICk7CgoKICB2b2lkIG9sZF9wYWdlciggTDRfdWlkIGlkICk7Cn07CgoKCgpjbGFzcyBTeXNfdGhy ZWFkX3N3aXRjaF9mcmFtZSA6IHB1YmxpYyBTeXNjYWxsX2ZyYW1lCnsKcHVibGljOgoKCiAgTDRf dWlkIGRlc3QoKSBjb25zdDsKCgogIE13b3JkIGhhc19kZXN0KCkgY29uc3Q7Cgp9OwoKCgoKY2xh c3MgU3lzX3RocmVhZF9zY2hlZHVsZV9mcmFtZSA6IHB1YmxpYyBTeXNjYWxsX2ZyYW1lCnsKcHVi bGljOgoKCiAgTXdvcmQgcGFyYW0oKSBjb25zdDsKCgogIEw0X3VpZCBwcmVlbXB0ZXIoKSBjb25z dDsKCgogIEw0X3VpZCBkZXN0KCkgY29uc3Q7CgoKICB2b2lkIG9sZF9wYXJhbSggTXdvcmQgb3Ag KTsKCgogIHZvaWQgdGltZSggVW5zaWduZWQ2NCB0ICk7CgoKICB2b2lkIG9sZF9wcmVlbXB0ZXIo IEw0X3VpZCBpZCApOwoKCiAgdm9pZCBwYXJ0bmVyKCBMNF91aWQgaWQgKTsKfTsKCgoKCmNsYXNz IFN5c191bm1hcF9mcmFtZSA6IHB1YmxpYyBTeXNjYWxsX2ZyYW1lCnsKcHVibGljOgoKCiAgTDRf ZnBhZ2UgZnBhZ2UoKSBjb25zdDsKCgogIE13b3JkIG1hcF9tYXNrKCkgY29uc3Q7CgoKICBib29s IGRvd25ncmFkZSgpIGNvbnN0OwoKCiAgYm9vbCBzZWxmX3VubWFwKCkgY29uc3Q7Cn07CgoKCgpj bGFzcyBTeXNfdGFza19uZXdfZnJhbWUgOiBwdWJsaWMgU3lzY2FsbF9mcmFtZQp7CnB1YmxpYzoK CgogIE13b3JkIG1jcCgpIGNvbnN0OwoKCiAgTDRfdWlkIG5ld19jaGllZigpIGNvbnN0OwoKCiAg TXdvcmQgc3AoKSBjb25zdDsKCgogIE13b3JkIGlwKCkgY29uc3Q7CgoKICBNd29yZCBoYXNfcGFn ZXIoKSBjb25zdDsKCgogIEw0X3VpZCBwYWdlcigpIGNvbnN0OwoKCiAgTDRfdWlkIGRlc3QoKSBj b25zdDsKCgogIHZvaWQgbmV3X3Rhc2tpZCggTDRfdWlkIGlkICk7Cgp9OwojIDI4MSAiYXV0by9l bnRyeV9mcmFtZS5oIgppbmxpbmUgdm9pZCBTeXNfaXBjX2ZyYW1lOjpyY3Zfc291cmNlKCBMNF91 aWQgaWQgKQp7CiAgZXNpID0gaWQucmF3KCk7IGVkaSA9IChpZC5yYXcoKSA+PiAzMik7Cn0KCgoK aW5saW5lIEw0X3VpZCBTeXNfaXBjX2ZyYW1lOjpyY3Zfc291cmNlKCkKewogIHJldHVybiBMNF91 aWQoKChVbnNpZ25lZDY0KWVkaSA8PCAzMikgfCAoVW5zaWduZWQ2NCllc2kpOwp9CgoKCmlubGlu ZSBMNF91aWQgU3lzX2lwY19mcmFtZTo6c25kX2Rlc3QoKSBjb25zdAp7CiAgcmV0dXJuIEw0X3Vp ZCggKFVuc2lnbmVkNjQpZXNpIHwgKChVbnNpZ25lZDY0KWVkaSA8PCAzMikgKTsKfQoKCgppbmxp bmUgTXdvcmQgU3lzX2lwY19mcmFtZTo6aGFzX3NuZF9kZXN0KCkgY29uc3QKewogIHJldHVybiBl c2k7Cn0KCgoKaW5saW5lIE13b3JkIFN5c19pcGNfZnJhbWU6OmlycSgpIGNvbnN0CnsKICByZXR1 cm4gZXNpIC0xOwp9CgoKCmlubGluZSB2b2lkIFN5c19pcGNfZnJhbWU6OnNuZF9kZXNjKCBNd29y ZCB3ICkKewogIGVheCA9dzsKfQoKCgppbmxpbmUgTDRfc25kX2Rlc2MgU3lzX2lwY19mcmFtZTo6 c25kX2Rlc2MoKSBjb25zdAp7CiAgcmV0dXJuIGVheDsKfQoKCgppbmxpbmUgTDRfdGltZW91dCBT eXNfaXBjX2ZyYW1lOjp0aW1lb3V0KCkgY29uc3QKewogIHJldHVybiBMNF90aW1lb3V0KCBlY3gg KTsKfQoKCgppbmxpbmUgTXdvcmQgU3lzX2lwY19mcmFtZTo6bXNnMCgpIGNvbnN0CnsKICByZXR1 cm4gZWR4Owp9CgoKCmlubGluZSBNd29yZCBTeXNfaXBjX2ZyYW1lOjptc2cxKCkgY29uc3QKewog IHJldHVybiBlYng7Cn0KCgoKaW5saW5lIEw0X3Jjdl9kZXNjIFN5c19pcGNfZnJhbWU6OnJjdl9k ZXNjKCkgY29uc3QKewogIHJldHVybiBlYnA7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX2lwY19mcmFt ZTo6cmN2X2Rlc2MoIE13b3JkIHcgKQp7CiAgZWJwID0gdzsKfQoKCgppbmxpbmUgTXdvcmQgU3lz X2lwY19mcmFtZTo6bXNnX2RvcGUoKSBjb25zdAp7CiAgcmV0dXJuIGVheDsKfQoKCgppbmxpbmUg dm9pZCBTeXNfaXBjX2ZyYW1lOjptc2cwKCBNd29yZCB3ICkKewogIGVkeCA9IHc7Cn0KCgoKaW5s aW5lIHZvaWQgU3lzX2lwY19mcmFtZTo6bXNnMSggTXdvcmQgdyApCnsKICBlYnggPSB3Owp9CgoK CmlubGluZSB2b2lkIFN5c19pcGNfZnJhbWU6Om1zZ19kb3BlKCBNd29yZCBkICkKewogIGVheCA9 IGQ7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX2lwY19mcmFtZTo6bXNnX2RvcGVfb3IoIE13b3JkIGQg KQp7CiAgZWF4IHw9IGQ7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX2lwY19mcmFtZTo6Y29weV9tc2co IFN5c19pcGNfZnJhbWUgKnRvICkgY29uc3QKewogIHRvLT5lZHggPSBlZHg7CiAgdG8tPmVieCA9 IGVieDsKfQoKCgoKCmlubGluZSBMNF91aWQgU3lzX2lkX25lYXJlc3RfZnJhbWU6OmRlc3QoKSBj b25zdAp7CiAgcmV0dXJuIEw0X3VpZCggKFVuc2lnbmVkNjQpZXNpIHwgKChVbnNpZ25lZDY0KWVk aSA8PCAzMikgKTsKfQoKCgppbmxpbmUgdm9pZCBTeXNfaWRfbmVhcmVzdF9mcmFtZTo6bmVhcmVz dCggTDRfdWlkIGlkICkKewogIGVzaSA9IGlkLnJhdygpOyBlZGkgPSAoaWQucmF3KCkgPj4gMzIp Owp9CgoKCgoKaW5saW5lIE13b3JkIFN5c19leF9yZWdzX2ZyYW1lOjpsdGhyZWFkKCkgY29uc3QK ewogIHJldHVybiBlYXg7Cn0KCgoKaW5saW5lIE13b3JkIFN5c19leF9yZWdzX2ZyYW1lOjpzcCgp IGNvbnN0CnsKICByZXR1cm4gZWN4Owp9CgoKCmlubGluZSBNd29yZCBTeXNfZXhfcmVnc19mcmFt ZTo6aXAoKSBjb25zdAp7CiAgcmV0dXJuIGVkeDsKfQoKCgppbmxpbmUgTDRfdWlkIFN5c19leF9y ZWdzX2ZyYW1lOjpwcmVlbXB0ZXIoKSBjb25zdAp7CiAgcmV0dXJuIEw0X3VpZCggKFVuc2lnbmVk NjQpZWJ4IHwgKChVbnNpZ25lZDY0KWVicCA8PCAzMikgKTsKfQoKCgppbmxpbmUgTDRfdWlkIFN5 c19leF9yZWdzX2ZyYW1lOjpwYWdlcigpIGNvbnN0CnsKICByZXR1cm4gTDRfdWlkKCAoVW5zaWdu ZWQ2NCllc2kgfCAoKFVuc2lnbmVkNjQpZWRpIDw8IDMyKSApOwp9CgoKCmlubGluZSB2b2lkIFN5 c19leF9yZWdzX2ZyYW1lOjpvbGRfZWZsYWdzKCBNd29yZCBvZWZsICkKewogIGVheCA9IG9lZmw7 Cn0KCgoKaW5saW5lIHZvaWQgU3lzX2V4X3JlZ3NfZnJhbWU6Om9sZF9zcCggTXdvcmQgb3NwICkK ewogIGVjeCA9IG9zcDsKfQoKCgppbmxpbmUgdm9pZCBTeXNfZXhfcmVnc19mcmFtZTo6b2xkX2lw KCBNd29yZCBvaXAgKQp7CiAgZWR4ID0gb2lwOwp9CgoKCmlubGluZSB2b2lkIFN5c19leF9yZWdz X2ZyYW1lOjpvbGRfcHJlZW1wdGVyKCBMNF91aWQgaWQgKQp7CiAgZWJ4ID0gaWQucmF3KCk7IGVi cCA9IGlkLnJhdygpID4+IDMyOwp9CgoKCmlubGluZSB2b2lkIFN5c19leF9yZWdzX2ZyYW1lOjpv bGRfcGFnZXIoIEw0X3VpZCBpZCApCnsKICBlc2kgPSBpZC5yYXcoKTsgZWRpID0gaWQucmF3KCkg Pj4gMzI7Cn0KCgoKCgppbmxpbmUgTDRfdWlkIFN5c190aHJlYWRfc3dpdGNoX2ZyYW1lOjpkZXN0 KCkgY29uc3QKewoKICByZXR1cm4gTDRfdWlkKCAoVW5zaWduZWQ2NCllc2kgfCAoKFVuc2lnbmVk NjQpZWRpIDw8IDMyKSApOwp9CgoKCmlubGluZSBNd29yZCBTeXNfdGhyZWFkX3N3aXRjaF9mcmFt ZTo6aGFzX2Rlc3QoKSBjb25zdAp7CiAgcmV0dXJuIGVzaTsKfQoKCgoKCmlubGluZSBNd29yZCBT eXNfdGhyZWFkX3NjaGVkdWxlX2ZyYW1lOjpwYXJhbSgpIGNvbnN0CnsKICByZXR1cm4gZWF4Owp9 CgoKCmlubGluZSBMNF91aWQgU3lzX3RocmVhZF9zY2hlZHVsZV9mcmFtZTo6cHJlZW1wdGVyKCkg Y29uc3QKewogIHJldHVybiBMNF91aWQoIChVbnNpZ25lZDY0KWVieCB8ICgoVW5zaWduZWQ2NCll YnAgPDwgMzIpICk7Cn0KCgoKaW5saW5lIEw0X3VpZCBTeXNfdGhyZWFkX3NjaGVkdWxlX2ZyYW1l OjpkZXN0KCkgY29uc3QKewogIHJldHVybiBMNF91aWQoIChVbnNpZ25lZDY0KWVzaSB8ICgoVW5z aWduZWQ2NCllZGkgPDwgMzIpICk7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX3RocmVhZF9zY2hlZHVs ZV9mcmFtZTo6b2xkX3BhcmFtKCBNd29yZCBvcCApCnsKICBlYXggPSBvcDsKfQoKCgppbmxpbmUg dm9pZCBTeXNfdGhyZWFkX3NjaGVkdWxlX2ZyYW1lOjp0aW1lKCBVbnNpZ25lZDY0IHQgKQp7CiAg ZWN4ID0gdDsgZWR4ID0gdCA+PiAzMjsKfQoKCgppbmxpbmUgdm9pZCBTeXNfdGhyZWFkX3NjaGVk dWxlX2ZyYW1lOjpvbGRfcHJlZW1wdGVyKCBMNF91aWQgaWQgKQp7CiAgZWJ4ID0gaWQucmF3KCk7 IGVicCA9IGlkLnJhdygpID4+IDMyOwp9CgoKCmlubGluZSB2b2lkIFN5c190aHJlYWRfc2NoZWR1 bGVfZnJhbWU6OnBhcnRuZXIoIEw0X3VpZCBpZCApCnsKICBlc2kgPSBpZC5yYXcoKTsgZWRpID0g aWQucmF3KCkgPj4gMzI7Cn0KCgoKCgppbmxpbmUgTDRfZnBhZ2UgU3lzX3VubWFwX2ZyYW1lOjpm cGFnZSgpIGNvbnN0CnsKICByZXR1cm4gTDRfZnBhZ2UoIGVheCApIDsKfQoKCgppbmxpbmUgTXdv cmQgU3lzX3VubWFwX2ZyYW1lOjptYXBfbWFzaygpIGNvbnN0CnsKICByZXR1cm4gZWN4Owp9CgoK CmlubGluZSBib29sIFN5c191bm1hcF9mcmFtZTo6ZG93bmdyYWRlKCkgY29uc3QKewogIHJldHVy biAhKGVjeCAmIDIpOwp9CgoKCmlubGluZSBib29sIFN5c191bm1hcF9mcmFtZTo6c2VsZl91bm1h cCgpIGNvbnN0CnsKICByZXR1cm4gZWN4ICYgMHg4MDAwMDAwMDsKfQoKCgoKCmlubGluZSBNd29y ZCBTeXNfdGFza19uZXdfZnJhbWU6Om1jcCgpIGNvbnN0CnsKICByZXR1cm4gZWF4Owp9CgoKCmlu bGluZSBMNF91aWQgU3lzX3Rhc2tfbmV3X2ZyYW1lOjpuZXdfY2hpZWYoKSBjb25zdAp7CiAgcmV0 dXJuIEw0X3VpZCggKFVuc2lnbmVkNjQpZWF4ICk7Cn0KCgoKaW5saW5lIE13b3JkIFN5c190YXNr X25ld19mcmFtZTo6c3AoKSBjb25zdAp7CiAgcmV0dXJuIGVjeDsKfQoKCgppbmxpbmUgTXdvcmQg U3lzX3Rhc2tfbmV3X2ZyYW1lOjppcCgpIGNvbnN0CnsKICByZXR1cm4gZWR4Owp9CgoKCmlubGlu ZSBNd29yZCBTeXNfdGFza19uZXdfZnJhbWU6Omhhc19wYWdlcigpIGNvbnN0CnsKICByZXR1cm4g ZWJ4Owp9CgoKCmlubGluZSBMNF91aWQgU3lzX3Rhc2tfbmV3X2ZyYW1lOjpwYWdlcigpIGNvbnN0 CnsKICByZXR1cm4gTDRfdWlkKCAoVW5zaWduZWQ2NCllYnggfCAoKFVuc2lnbmVkNjQpZWJwIDw8 IDMyKSApOwp9CgoKCmlubGluZSBMNF91aWQgU3lzX3Rhc2tfbmV3X2ZyYW1lOjpkZXN0KCkgY29u c3QKewogIHJldHVybiBMNF91aWQoIChVbnNpZ25lZDY0KWVzaSB8ICgoVW5zaWduZWQ2NCllZGkg PDwgMzIpICk7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX3Rhc2tfbmV3X2ZyYW1lOjpuZXdfdGFza2lk KCBMNF91aWQgaWQgKQp7CiAgZXNpID0gaWQucmF3KCk7IGVkaSA9IGlkLnJhdygpID4+IDMyOwp9 CiMgMjYzICJhdXRvL2NvbnRleHQuaCIgMgojIDEgImF1dG8vdGhyZWFkX3N0YXRlLmgiIDEKIyAx MiAiYXV0by90aHJlYWRfc3RhdGUuaCIKZW51bQp7CiAgVGhyZWFkX2ludmFsaWQgPSAwLAogIFRo cmVhZF9ydW5uaW5nID0gMHgxLAogIFRocmVhZF93YWl0aW5nID0gMHgyLAogIFRocmVhZF9yZWNl aXZpbmcgPSAweDQsCiAgVGhyZWFkX3BvbGxpbmcgPSAweDgsCiAgVGhyZWFkX2lwY19pbl9wcm9n cmVzcyA9IDB4MTAsCiAgVGhyZWFkX3NlbmRfaW5fcHJvZ3Jlc3MgPSAweDIwLAogIFRocmVhZF9i dXN5ID0gMHg0MCwKICBUaHJlYWRfY2FuY2VsID0gMHgxMDAsCiAgVGhyZWFkX2RlYWQgPSAweDIw MCwKICBUaHJlYWRfcG9sbGluZ19sb25nID0gMHg0MDAsCiAgVGhyZWFkX2J1c3lfbG9uZyA9IDB4 ODAwLAogIFRocmVhZF9yY3Zsb25nX2luX3Byb2dyZXNzID0gMHg0MDAwLAogIFRocmVhZF9mcHVf b3duZXIgPSAweDEwMDAwLAoKCiAgVGhyZWFkX2lwY19zZW5kaW5nX21hc2sgPSBUaHJlYWRfc2Vu ZF9pbl9wcm9ncmVzcwogICAgfCBUaHJlYWRfcG9sbGluZyB8IFRocmVhZF9wb2xsaW5nX2xvbmcs CiAgVGhyZWFkX2lwY19yZWNlaXZpbmdfbWFzayA9IFRocmVhZF93YWl0aW5nIHwgVGhyZWFkX3Jl Y2VpdmluZwogICAgfCBUaHJlYWRfYnVzeSB8IFRocmVhZF9yY3Zsb25nX2luX3Byb2dyZXNzIHwg VGhyZWFkX2J1c3lfbG9uZywKICBUaHJlYWRfaXBjX21hc2sgPSBUaHJlYWRfaXBjX2luX3Byb2dy ZXNzCiAgICB8IFRocmVhZF9pcGNfc2VuZGluZ19tYXNrIHwgVGhyZWFkX2lwY19yZWNlaXZpbmdf bWFzaywKCn07CiMgMjY0ICJhdXRvL2NvbnRleHQuaCIgMgojIDI4MCAiYXV0by9jb250ZXh0Lmgi CmlubGluZSBDb250ZXh0OjpDb250ZXh0KFRocmVhZF9sb2NrICp0aHJlYWRfbG9jaywKICAgICAg ICAgICAgICAgICAgU3BhY2VfY29udGV4dCogc3BhY2VfY29udGV4dCkKICA6IF9zcGFjZV9jb250 ZXh0IChzcGFjZV9jb250ZXh0KSwKICAgIF90aHJlYWRfbG9jayAodGhyZWFkX2xvY2spCnsKCgoK CgoKCiAgTXdvcmQgKmluaXRfc3AgPSByZWludGVycHJldF9jYXN0PE13b3JkKj4KICAgIChyZWlu dGVycHJldF9jYXN0PE13b3JkPih0aGlzKSArIHNpemUgLSBzaXplb2YoRW50cnlfZnJhbWUpKTsK CgoKCiAgc21wX2Nhcygma2VybmVsX3NwLCAoTXdvcmQqKTAsIGluaXRfc3ApOwp9CgoKCgoKCmlu bGluZSB1bnNpZ25lZCBDb250ZXh0OjpzdGF0ZSgpIGNvbnN0CnsgcmV0dXJuIF9zdGF0ZTsgfQoK CgoKCgppbmxpbmUgYm9vbCBDb250ZXh0OjpleGlzdHMoKSBjb25zdAp7IHJldHVybiBfc3RhdGUg IT0gVGhyZWFkX2ludmFsaWQ7IH0KCgoKCgoKCmlubGluZSBib29sCkNvbnRleHQ6OnN0YXRlX2Fk ZCh1bnNpZ25lZCBiaXRzKQp7CiAgYm9vbCByZXQ7CiAgdW5zaWduZWQgb2xkOwogIGRvCiAgICB7 CiAgICAgIG9sZCA9IF9zdGF0ZTsKICAgICAgcmV0ID0gKF9zdGF0ZSAmIGJpdHMpID09IDA7CiAg ICB9CiAgd2hpbGUgKCEgc21wX2NhcygmX3N0YXRlLCBvbGQsIG9sZCB8IGJpdHMpKTsKCiAgcmV0 dXJuIHJldDsKfQoKCgoKCgoKaW5saW5lIGJvb2wKQ29udGV4dDo6c3RhdGVfZGVsKHVuc2lnbmVk IGJpdHMpCnsKICBib29sIHJldDsKICB1bnNpZ25lZCBvbGQ7CiAgZG8KICAgIHsKICAgICAgb2xk ID0gX3N0YXRlOwogICAgICByZXQgPSAoX3N0YXRlICYgYml0cykgPT0gYml0czsKICAgIH0KICB3 aGlsZSAoISBzbXBfY2FzKCZfc3RhdGUsIG9sZCwgb2xkICYgfmJpdHMpKTsKCiAgcmV0dXJuIHJl dDsKfQojIDM2NyAiYXV0by9jb250ZXh0LmgiCmlubGluZSBib29sCkNvbnRleHQ6OnN0YXRlX2No YW5nZSh1bnNpZ25lZCBtYXNrLCB1bnNpZ25lZCBiaXRzKQp7CiAgYm9vbCByZXQ7CiAgdW5zaWdu ZWQgb2xkOwogIGRvCiAgICB7CiAgICAgIG9sZCA9IF9zdGF0ZTsKICAgICAgcmV0ID0gKChvbGQg JiBiaXRzICYgbWFzaykgPT0gMCkgJiYgKChvbGQgJiB+bWFzaykgPT0gfm1hc2spOwogICAgfQog IHdoaWxlICghIHNtcF9jYXMoJl9zdGF0ZSwgb2xkLCAob2xkICYgbWFzaykgfCBiaXRzKSk7Cgog IHJldHVybiByZXQ7Cn0KIyAzOTUgImF1dG8vY29udGV4dC5oIgppbmxpbmUgYm9vbApDb250ZXh0 OjpzdGF0ZV9jaGFuZ2Vfc2FmZWx5KHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIGJpdHMpCnsKICBi b29sIHJldDsKICB1bnNpZ25lZCBvbGQ7CiAgZG8KICAgIHsKICAgICAgb2xkID0gX3N0YXRlOwog ICAgICByZXQgPSAoKG9sZCAmIGJpdHMgJiBtYXNrKSA9PSAwKSAmJiAoKG9sZCAmIH5tYXNrKSA9 PSB+bWFzayk7CiAgICAgIGlmICghIHJldCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAg d2hpbGUgKCEgc21wX2NhcygmX3N0YXRlLCBvbGQsIChvbGQgJiBtYXNrKSB8IGJpdHMpKTsKCiAg cmV0dXJuIHRydWU7Cn0KIyA0MjEgImF1dG8vY29udGV4dC5oIgppbmxpbmUgdm9pZApDb250ZXh0 OjpzdGF0ZV9jaGFuZ2VfZGlydHkodW5zaWduZWQgbWFzaywgdW5zaWduZWQgYml0cykKewogIF9z dGF0ZSAmPSBtYXNrOwogIF9zdGF0ZSB8PSBiaXRzOwp9CgoKCgoKCgppbmxpbmUgU3BhY2VfY29u dGV4dCAqCkNvbnRleHQ6OnNwYWNlX2NvbnRleHQoKSBjb25zdAp7CiAgcmV0dXJuIF9zcGFjZV9j b250ZXh0Owp9CgoKCgoKCmlubGluZSBUaHJlYWRfbG9jayAqCkNvbnRleHQ6OnRocmVhZF9sb2Nr KCkKewogIHJldHVybiBfdGhyZWFkX2xvY2s7Cn0KCgoKCgoKaW5saW5lIHNjaGVkX3QgKgpDb250 ZXh0OjpzY2hlZCgpCnsKICByZXR1cm4gJl9zY2hlZDsKfQoKCgoKCgppbmxpbmUgUmV0dXJuX2Zy YW1lICpDb250ZXh0OjpyZWdzKCkgY29uc3QKewogIHJldHVybiByZWludGVycHJldF9jYXN0PFJl dHVybl9mcmFtZSAqPgogICAgKHJlaW50ZXJwcmV0X2Nhc3Q8TXdvcmQ+KHRoaXMpICsgc2l6ZSAt IHNpemVvZihSZXR1cm5fZnJhbWUpKTsKfQoKCgoKCmlubGluZSB2b2lkCkNvbnRleHQ6OmluY19s b2NrX2NudCgpCnsKICBfbG9ja19jbnQgKys7Cn0KCgoKCgoKaW5saW5lIHZvaWQKQ29udGV4dDo6 ZGVjX2xvY2tfY250KCkKewogIF9sb2NrX2NudC0tOwp9CgoKCgoKCmlubGluZSBpbnQKQ29udGV4 dDo6bG9ja19jbnQoKQp7CiAgcmV0dXJuIF9sb2NrX2NudDsKfQoKCgoKaW5saW5lIHZvaWQKQ29u dGV4dDo6dGltZXJfdGljaygpCnsKICBpZiAoIUNvbmZpZzo6ZmluZV9ncmFpbmVkX2NwdXRpbWUp CiAgICBjdXJyZW50KCktPnNjaGVkKCktPnVwZGF0ZV9jcHV0aW1lKCk7CgogIGlmICgtLXRpbWVz bGljZV90aWNrc19sZWZ0IDw9IDApCiAgICBjdXJyZW50KCktPnNjaGVkdWxlKCk7Cn0KCgoKCgoK aW5saW5lIGJvb2wKQ29udGV4dDo6aW5fcmVhZHlfbGlzdCgpCnsKICByZXR1cm4gcmVhZHlfbmV4 dDsKfQoKCgoKCmlubGluZSB2b2lkCkNvbnRleHQ6OnJlYWR5X2VucXVldWUoKQp7CiAgTG9ja19n dWFyZCA8Q3B1X2xvY2s+IGd1YXJkICgmY3B1X2xvY2spOwoKICBDb250ZXh0ICpzaWJsaW5nID0g MDsKICB1bnNpZ25lZCBpOwoKICBpZiAoISBpbl9yZWFkeV9saXN0KCkpCiAgICB7CiAgICAgIGlm ICghIHByaW9fZmlyc3Rbc2NoZWQoKS0+cHJpbygpXSkKICAgICAgICBwcmlvX2ZpcnN0W3NjaGVk KCktPnByaW8oKV0gPSB0aGlzOwogICAgICBpZiAoISBwcmlvX25leHRbc2NoZWQoKS0+cHJpbygp XSkKICAgICAgICBwcmlvX25leHRbc2NoZWQoKS0+cHJpbygpXSA9IHRoaXM7CgogICAgICBpZiAo c2NoZWQoKS0+cHJpbygpID4gcHJpb19oaWdoZXN0KQogICAgICAgIHByaW9faGlnaGVzdCA9IHNj aGVkKCktPnByaW8oKTsKCgoKICAgICAgaSA9IHNjaGVkKCktPnByaW8oKTsKICAgICAgZG8KICAg ICAgICB7CiAgICAgICAgICBpZiAoKytpID09IDI1NikgaSA9IDA7CiAgICAgICAgICBzaWJsaW5n ID0gcHJpb19maXJzdFtpXTsKICAgICAgICB9CiAgICAgIHdoaWxlICghIHNpYmxpbmcpOwoKICAg ICAgKCh2b2lkKSAoKCEgaW5fcmVhZHlfbGlzdCgpKSA/IDAgOiAoX19hc3NlcnRfZmFpbCAoIiEg aW5fcmVhZHlfbGlzdCgpIiwgImF1dG8vY29udGV4dC5oIiwgNTYxLCAoKGNvbnN0IGNoYXIgKikg MCkpLCAwKSkpOwoKICAgICAgcmVhZHlfbmV4dCA9IHNpYmxpbmc7CiAgICAgIHJlYWR5X3ByZXYg PSBzaWJsaW5nLT5yZWFkeV9wcmV2OwogICAgICBzaWJsaW5nLT5yZWFkeV9wcmV2ID0gdGhpczsK ICAgICAgcmVhZHlfcHJldi0+cmVhZHlfbmV4dCA9IHRoaXM7CgogICAgICAoKHZvaWQpICgocmVh ZHlfcHJldi0+c2NoZWQoKS0+cHJpbygpIDw9IHNjaGVkKCktPnByaW8oKSB8fCBzY2hlZCgpLT5w cmlvKCkgPT0gMCkgPyAwIDogKF9fYXNzZXJ0X2ZhaWwgKCJyZWFkeV9wcmV2LT5zY2hlZCgpLT5w cmlvKCkgPD0gc2NoZWQoKS0+cHJpbygpIHx8IHNjaGVkKCktPnByaW8oKSA9PSAwIiwgImF1dG8v Y29udGV4dC5oIiwgNTY5LCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwoKICAgIH0KCn0KCgoK CgppbmxpbmUgdm9pZApDb250ZXh0OjpyZWFkeV9kZXF1ZXVlKCkKewogIExvY2tfZ3VhcmQgPENw dV9sb2NrPiBndWFyZCAoJmNwdV9sb2NrKTsKCiAgaWYgKGluX3JlYWR5X2xpc3QoKSkKICAgIHsK ICAgICAgaWYgKHByaW9fZmlyc3Rbc2NoZWQoKS0+cHJpbygpXSA9PSB0aGlzKQogICAgICAgIHBy aW9fZmlyc3Rbc2NoZWQoKS0+cHJpbygpXSA9IHJlYWR5X25leHQtPnNjaGVkKCktPnByaW8oKSA9 PSBzY2hlZCgpLT5wcmlvKCkgPyByZWFkeV9uZXh0IDogMDsKICAgICAgaWYgKHByaW9fbmV4dFtz Y2hlZCgpLT5wcmlvKCldID09IHRoaXMpCiAgICAgICAgcHJpb19uZXh0W3NjaGVkKCktPnByaW8o KV0gPSByZWFkeV9uZXh0LT5zY2hlZCgpLT5wcmlvKCkgPT0gc2NoZWQoKS0+cHJpbygpID8KICAg ICAgICAgIHJlYWR5X25leHQgOiBwcmlvX2ZpcnN0W3NjaGVkKCktPnByaW8oKV07CgogICAgICBp ZiAocHJpb19maXJzdFtzY2hlZCgpLT5wcmlvKCldID09IDAgJiYgc2NoZWQoKS0+cHJpbygpID09 IHByaW9faGlnaGVzdCkKICAgICAgICB7CiAgICAgICAgICAoKHZvaWQpICgocmVhZHlfbmV4dC0+ c2NoZWQoKS0+cHJpbygpIDwgc2NoZWQoKS0+cHJpbygpKSA/IDAgOiAoX19hc3NlcnRfZmFpbCAo InJlYWR5X25leHQtPnNjaGVkKCktPnByaW8oKSA8IHNjaGVkKCktPnByaW8oKSIsICJhdXRvL2Nv bnRleHQuaCIsIDU5MywgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsKICAgICAgICAgIHByaW9f aGlnaGVzdCA9IHJlYWR5X3ByZXYtPnNjaGVkKCktPnByaW8oKTsKICAgICAgICB9CiAgICAgIHJl YWR5X3ByZXYtPnJlYWR5X25leHQgPSByZWFkeV9uZXh0OwogICAgICByZWFkeV9uZXh0LT5yZWFk eV9wcmV2ID0gcmVhZHlfcHJldjsKICAgICAgcmVhZHlfbmV4dCA9IDA7CgogICAgfQoKfQojIDYx MiAiYXV0by9jb250ZXh0LmgiCmlubGluZSBDb250ZXh0ICoKQ29udGV4dDo6Z2V0X25leHQoKQp7 CiAgcmV0dXJuIF9zdGFja19saW5rOwp9CgoKCgoKCmlubGluZSB2b2lkCkNvbnRleHQ6OnNldF9u ZXh0KENvbnRleHQgKm5leHQpCnsKICBfc3RhY2tfbGluayA9IG5leHQ7Cn0KIyA2MzYgImF1dG8v Y29udGV4dC5oIgppbmxpbmUgQ29udGV4dCoKQ29udGV4dDo6ZG9uYXRlZSgpCnsKICByZXR1cm4g X2RvbmF0ZWU7Cn0KCgoKaW5saW5lIHZvaWQKQ29udGV4dDo6c2V0X2RvbmF0ZWUoQ29udGV4dCog ZG9uYXRlZSkKewogIF9kb25hdGVlID0gZG9uYXRlZTsKfQoKCgppbmxpbmUgdm9pZApDb250ZXh0 OjpzZXRfa2VybmVsX3NwKE13b3JkICplc3ApCnsKICBrZXJuZWxfc3AgPSBlc3A7Cn0KCgoKaW5s aW5lIEZwdV9zdGF0ZSAqY29uc3QgQ29udGV4dDo6ZnB1X3N0YXRlKCkKewogIHJldHVybiAmX2Zw dV9zdGF0ZTsKfQoKCgoKCgppbmxpbmUgdm9pZCBDb250ZXh0OjpoYW5kbGVfZnB1X3RyYXAoKQp7 CgogIEZwdTo6ZW5hYmxlKCk7CgoKICBpZiAoRnB1Ojpvd25lcigpKSB7CiAgICBGcHU6Om93bmVy KCktPnN0YXRlX2NoYW5nZV9kaXJ0eSAoflRocmVhZF9mcHVfb3duZXIsIDApOwogICAgRnB1Ojpv d25lcigpLT5mcHVfc3RhdGUoKS0+c2F2ZV9zdGF0ZSgpOwogIH0KCgogIGlmICghZnB1X3N0YXRl KCktPnN0YXRlX2J1ZmZlcigpKQogICAgZnB1X3N0YXRlKCktPmFsbG9jX3N0YXRlKCk7CgoKICBz dGF0ZV9jaGFuZ2VfZGlydHkgKH4wLCBUaHJlYWRfZnB1X293bmVyKTsKICBmcHVfc3RhdGUoKS0+ cmVzdG9yZV9zdGF0ZSgpOwoKICBGcHU6OnNldF9vd25lcih0aGlzKTsKfQojIDcgImF1dG8vcmVj ZWl2ZXIuaCIgMgojIDEgImF1dG8vdGltZXIuaCIgMQojIDExICJhdXRvL3RpbWVyLmgiCmNsYXNz IENvbnRleHQ7CgpjbGFzcyBUaW1lcgp7CnB1YmxpYzoKCgoKCgogIHN0YXRpYyB2b2lkIGluaXQo KTsKCgoKCiAgc3RhdGljIGJvb2wgaW5pdF9kb25lOwoKCgoKCiAgc3RhdGljIHZvaWQgYWNrbm93 bGVkZ2UoKTsKCgoKCgogIHN0YXRpYyB2b2lkIGVuYWJsZSgpOwoKCgoKICBzdGF0aWMgdm9pZCBk aXNhYmxlKCk7Cn07CgpjbGFzcyB0aW1lb3V0X3QKewogIGZyaWVuZCBjbGFzcyB0aW1lcjsKCiAg dGltZW91dF90KGNvbnN0IHRpbWVvdXRfdCYpOwoKCiAgdW5zaWduZWQgbG9uZyBsb25nIF93YWtl dXA7CiAgdGltZW91dF90ICpfbmV4dCwgKl9wcmV2OwoKICB1bmlvbiB7CiAgICBzdHJ1Y3Qgewog ICAgICBib29sIHNldCA6IDE7CiAgICAgIGJvb2wgaGl0IDogMTsKICAgIH0gX2ZsYWdzOwogICAg dW5zaWduZWQgc2hvcnQgX2ZsYWd3b3JkOwogIH07CgpwdWJsaWM6CgoKCiAgdGltZW91dF90KCk7 CgogIGJvb2wgaXNfc2V0KCk7CgogIGJvb2wgaGFzX2hpdCgpOwoKICBDb250ZXh0ICogb3duZXIo KTsKCiAgdm9pZCBzZXQodW5zaWduZWQgbG9uZyBsb25nIGFic19taWNyb3NlYyk7CgogIHZvaWQg c2V0X2FnYWluKCk7CgogIHZvaWQgcmVzZXQoKTsKCiAgbG9uZyBsb25nIGdldF90aW1lb3V0KCk7 Cgpwcml2YXRlOgogIHZvaWQgZW5xdWV1ZSgpOwoKICBib29sIGNoZWNrX2hpdCgpOwp9OwoKY2xh c3MgdGltZXIKewogIGZyaWVuZCBjbGFzcyB0aW1lb3V0X3Q7CgoKICB0aW1lcigpOwogIHRpbWVy KGNvbnN0IHRpbWVyJik7CgoKICBzdGF0aWMgdGltZW91dF90ICpmaXJzdF90aW1lb3V0OwoKcHVi bGljOgogIHN0YXRpYyB2b2lkIHVwZGF0ZV9zeXN0ZW1fY2xvY2soKTsKCnByaXZhdGU6CiAgc3Rh dGljIHZvaWQgZG9fdGltZW91dHMoKTsKfTsKIyAxMjIgImF1dG8vdGltZXIuaCIKIyAxICJhdXRv L3J0Yy5oIiAxCiMgMTEgImF1dG8vcnRjLmgiCmNsYXNzIFJ0Ywp7CnByaXZhdGU6CiAgUnRjKCk7 CiAgUnRjKGNvbnN0IFJ0YyYpOwoKcHVibGljOgoKICBzdGF0aWMgdm9pZCBpbml0KHZvaWQpOwoK ICBzdGF0aWMgdm9pZCBkb25lKHZvaWQpOwoKICBzdGF0aWMgdm9pZCBzZXRfZnJlcV9zbG93KHZv aWQpOwoKICBzdGF0aWMgdm9pZCBzZXRfZnJlcV9ub3JtYWwodm9pZCk7CgoKICBzdGF0aWMgdm9p ZCBhY2tfcmVzZXQodm9pZCk7Cgpwcml2YXRlOgogIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJlZ19y ZWFkKHVuc2lnbmVkIGNoYXIgcmVnKTsKCiAgc3RhdGljIHZvaWQgcmVnX3dyaXRlKHVuc2lnbmVk IGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCk7Cn07CgoKCgoKIyAxICJhdXRvL3BpYy5oIiAx CiMgMTQgImF1dG8vcGljLmgiCmNsYXNzIFBpYwp7CnB1YmxpYzoKCgoKICB0eXBlZGVmIHVuc2ln bmVkIFN0YXR1czsKCgoKCiAgc3RhdGljIHZvaWQgaW5pdCgpOwoKCgoKICBzdGF0aWMgdm9pZCBk aXNhYmxlKCB1bnNpZ25lZCBpcnFudW0gKTsKCgoKCiAgc3RhdGljIHZvaWQgZW5hYmxlICggdW5z aWduZWQgaXJxbnVtICk7CgoKCgogIHN0YXRpYyB2b2lkIGFja25vd2xlZGdlKCB1bnNpZ25lZCBp cnEgKTsKIyA0OSAiYXV0by9waWMuaCIKICBzdGF0aWMgdm9pZCBkaXNhYmxlX2xvY2tlZCggdW5z aWduZWQgaXJxbnVtICk7CiMgNTggImF1dG8vcGljLmgiCiAgc3RhdGljIHZvaWQgZW5hYmxlX2xv Y2tlZCAoIHVuc2lnbmVkIGlycW51bSApOwoKCgoKCiAgc3RhdGljIFN0YXR1cyBkaXNhYmxlX2Fs bF9zYXZlKCk7CgoKCgoKCiAgc3RhdGljIHZvaWQgcmVzdG9yZV9hbGwoIFN0YXR1cyBzICk7CiMg ODEgImF1dG8vcGljLmgiCiAgc3RhdGljIHZvaWQgYWNrbm93bGVkZ2VfbG9ja2VkKCB1bnNpZ25l ZCBpcnEgKTsKCnByaXZhdGU6CgpwdWJsaWM6CiAgZW51bSB7CiAgICBNQVNURVJfUElDX0JBU0Ug PSAweDIwLAogICAgU0xBVkVTX1BJQ19CQVNFID0gMHhhMCwKICAgIE9GRl9JQ1cgPSAweDAwLAog ICAgT0ZGX09DVyA9IDB4MDEsCgogICAgTUFTVEVSX0lDVyA9IE1BU1RFUl9QSUNfQkFTRSArIE9G Rl9JQ1csCiAgICBNQVNURVJfT0NXID0gTUFTVEVSX1BJQ19CQVNFICsgT0ZGX09DVywKICAgIFNM QVZFU19JQ1cgPSBTTEFWRVNfUElDX0JBU0UgKyBPRkZfSUNXLAogICAgU0xBVkVTX09DVyA9IFNM QVZFU19QSUNfQkFTRSArIE9GRl9PQ1csCgoKCgoKICAgIElDV19URU1QTEFURSA9IDB4MTAsCgog ICAgTEVWTF9UUklHR0VSID0gMHgwOCwKICAgIEVER0VfVFJJR0dFUiA9IDB4MDAsCiAgICBBRERS X0lOVFJWTDQgPSAweDA0LAogICAgQUREUl9JTlRSVkw4ID0gMHgwMCwKICAgIFNJTkdMRV9fTU9E RSA9IDB4MDIsCiAgICBDQVNDQURFX01PREUgPSAweDAwLAogICAgSUNXNF9fTkVFREVEID0gMHgw MSwKICAgIE5PX0lDVzRfTkVFRCA9IDB4MDAsCgoKCgoKICAgIFNMQVZFX09OX0lSMCA9IDB4MDEs CiAgICBTTEFWRV9PTl9JUjEgPSAweDAyLAogICAgU0xBVkVfT05fSVIyID0gMHgwNCwKICAgIFNM QVZFX09OX0lSMyA9IDB4MDgsCiAgICBTTEFWRV9PTl9JUjQgPSAweDEwLAogICAgU0xBVkVfT05f SVI1ID0gMHgyMCwKICAgIFNMQVZFX09OX0lSNiA9IDB4NDAsCiAgICBTTEFWRV9PTl9JUjcgPSAw eDgwLAoKICAgIElfQU1fU0xBVkVfMCA9IDB4MDAsCiAgICBJX0FNX1NMQVZFXzEgPSAweDAxLAog ICAgSV9BTV9TTEFWRV8yID0gMHgwMiwKICAgIElfQU1fU0xBVkVfMyA9IDB4MDMsCiAgICBJX0FN X1NMQVZFXzQgPSAweDA0LAogICAgSV9BTV9TTEFWRV81ID0gMHgwNSwKICAgIElfQU1fU0xBVkVf NiA9IDB4MDYsCiAgICBJX0FNX1NMQVZFXzcgPSAweDA3LAoKCgoKCiAgICBTTkZfTU9ERV9FTkEg PSAweDEwLAogICAgU05GX01PREVfRElTID0gMHgwMCwKICAgIEJVRkZFUkRfTU9ERSA9IDB4MDgs CiAgICBOT05CVUZEX01PREUgPSAweDAwLAogICAgQVVUT19FT0lfTU9EID0gMHgwMiwKICAgIE5S TUxfRU9JX01PRCA9IDB4MDAsCiAgICBJODA4Nl9FTU1fTU9EID0gMHgwMSwKICAgIFNFVF9NQ1Nf TU9ERSA9IDB4MDAsCgoKCgoKICAgIFBJQ01fTUFTSyA9IDB4RkYsCiAgICBQSUNTX01BU0sgPSAw eEZGLAoKCgoKCiAgICBOT05fU1BFQ19FT0kgPSAweDIwLAogICAgU1BFQ0lGSUNfRU9JID0gMHg2 MCwKICAgIFJPVF9OT05fU1BFQyA9IDB4YTAsCiAgICBTRVRfUk9UX0FFT0kgPSAweDgwLAogICAg UlNFVF9ST1RBRU9JID0gMHgwMCwKICAgIFJPVF9TUEVDX0VPSSA9IDB4ZTAsCiAgICBTRVRfUFJJ T1JJVFkgPSAweGMwLAogICAgTk9fT1BFUkFUSU9OID0gMHg0MCwKCiAgICBTRU5EX0VPSV9JUjAg PSAweDAwLAogICAgU0VORF9FT0lfSVIxID0gMHgwMSwKICAgIFNFTkRfRU9JX0lSMiA9IDB4MDIs CiAgICBTRU5EX0VPSV9JUjMgPSAweDAzLAogICAgU0VORF9FT0lfSVI0ID0gMHgwNCwKICAgIFNF TkRfRU9JX0lSNSA9IDB4MDUsCiAgICBTRU5EX0VPSV9JUjYgPSAweDA2LAogICAgU0VORF9FT0lf SVI3ID0gMHgwNywKCgoKCgogICAgT0NXX1RFTVBMQVRFID0gMHgwOCwKICAgIFNQRUNJQUxfTUFT SyA9IDB4NDAsCiAgICBNQVNLX01ERV9TRVQgPSAweDIwLAogICAgTUFTS19NREVfUlNUID0gMHgw MCwKICAgIFBPTExfQ09NTUFORCA9IDB4MDQsCiAgICBOT19QT0xMX0NNTkQgPSAweDAwLAogICAg UkVBRF9ORVhUX1JEID0gMHgwMiwKICAgIFJFQURfSVJfT05SRCA9IDB4MDAsCiAgICBSRUFEX0lT X09OUkQgPSAweDAxLAoKCgoKICAgIFBJQ01fSUNXMSA9IChJQ1dfVEVNUExBVEUgfCBFREdFX1RS SUdHRVIgfCBBRERSX0lOVFJWTDgKICAgICAgICAgICAgICAgICAgICAgICB8IENBU0NBREVfTU9E RSB8IElDVzRfX05FRURFRCksCiAgICBQSUNNX0lDVzMgPSBTTEFWRV9PTl9JUjIsCiAgICBQSUNN X0lDVzQgPSAoU05GX01PREVfRElTIHwgTk9OQlVGRF9NT0RFIHwgTlJNTF9FT0lfTU9ECiAgICAg ICAgICAgICAgICAgICAgICAgfCBJODA4Nl9FTU1fTU9EKSwKCiAgICBQSUNTX0lDVzEgPSAoSUNX X1RFTVBMQVRFIHwgRURHRV9UUklHR0VSIHwgQUREUl9JTlRSVkw4CiAgICAgICAgICAgICAgICAg ICAgICAgfCBDQVNDQURFX01PREUgfCBJQ1c0X19ORUVERUQpLAogICAgUElDU19JQ1czID0gSV9B TV9TTEFWRV8yLAogICAgUElDU19JQ1c0ID0gKFNORl9NT0RFX0RJUyB8IE5PTkJVRkRfTU9ERSB8 IE5STUxfRU9JX01PRAogICAgICAgICAgICAgICAgICAgICAgIHwgSTgwODZfRU1NX01PRCksCgog IH07Cgpwcml2YXRlOgojIDIxOSAiYXV0by9waWMuaCIKICBzdGF0aWMgdm9pZCBwaWNfaW5pdCh1 bnNpZ25lZCBjaGFyIG1hc3Rlcl9iYXNlLCB1bnNpZ25lZCBjaGFyIHNsYXZlX2Jhc2UpOwp9Owoj IDIyOSAiYXV0by9waWMuaCIKIyAxICJhdXRvL2lvLmgiIDEKIyAxNiAiYXV0by9pby5oIgpjbGFz cyBJbwp7CnB1YmxpYzoKCgogIHN0YXRpYyB2b2lkIGlvZGVsYXkoKTsKCgoKCiAgc3RhdGljIFVu c2lnbmVkOCBpbjggKCB1bnNpZ25lZCBwb3J0ICk7CgoKCgogIHN0YXRpYyBVbnNpZ25lZDE2IGlu MTYoIHVuc2lnbmVkIHBvcnQgKTsKCgoKCiAgc3RhdGljIFVuc2lnbmVkMzIgaW4zMiggdW5zaWdu ZWQgcG9ydCApOwoKCgoKICBzdGF0aWMgdm9pZCBvdXQ4ICggVW5zaWduZWQ4IHZhbCwgdW5zaWdu ZWQgcG9ydCApOwoKCgoKICBzdGF0aWMgdm9pZCBvdXQxNiggVW5zaWduZWQxNiB2YWwsIHVuc2ln bmVkIHBvcnQgKTsKCgoKCiAgc3RhdGljIHZvaWQgb3V0MzIoIFVuc2lnbmVkMzIgdmFsLCB1bnNp Z25lZCBwb3J0ICk7CgoKCgoKCgogIHN0YXRpYyBVbnNpZ25lZDggaW44X3AgKCB1bnNpZ25lZCBw b3J0ICk7CgoKCgogIHN0YXRpYyBVbnNpZ25lZDE2IGluMTZfcCggdW5zaWduZWQgcG9ydCApOwoK CgoKICBzdGF0aWMgVW5zaWduZWQzMiBpbjMyX3AoIHVuc2lnbmVkIHBvcnQgKTsKCgoKCiAgc3Rh dGljIHZvaWQgb3V0OF9wICggVW5zaWduZWQ4IHZhbCwgdW5zaWduZWQgcG9ydCApOwoKCgoKICBz dGF0aWMgdm9pZCBvdXQxNl9wKCBVbnNpZ25lZDE2IHZhbCwgdW5zaWduZWQgcG9ydCApOwoKCgoK ICBzdGF0aWMgdm9pZCBvdXQzMl9wKCBVbnNpZ25lZDMyIHZhbCwgdW5zaWduZWQgcG9ydCApOwoK Cn07CiMgOTYgImF1dG8vaW8uaCIKaW5saW5lIFVuc2lnbmVkOCBJbzo6aW44X3AoIHVuc2lnbmVk IHBvcnQgKQp7CiAgVW5zaWduZWQ4IHRtcCA9IGluOChwb3J0KTsKICBpb2RlbGF5KCk7CiAgcmV0 dXJuIHRtcDsKfQoKCgppbmxpbmUgVW5zaWduZWQxNiBJbzo6aW4xNl9wKCB1bnNpZ25lZCBwb3J0 ICkKewogIFVuc2lnbmVkMTYgdG1wID0gaW4xNihwb3J0KTsKICBpb2RlbGF5KCk7CiAgcmV0dXJu IHRtcDsKfQoKCgppbmxpbmUgVW5zaWduZWQzMiBJbzo6aW4zMl9wKCB1bnNpZ25lZCBwb3J0ICkK ewogIFVuc2lnbmVkMzIgdG1wID0gaW4zMihwb3J0KTsKICBpb2RlbGF5KCk7CiAgcmV0dXJuIHRt cDsKfQoKCgppbmxpbmUgdm9pZCBJbzo6b3V0OF9wKCBVbnNpZ25lZDggdmFsLCB1bnNpZ25lZCBw b3J0ICkKewogIG91dDgodmFsLHBvcnQpOyBpb2RlbGF5KCk7Cn0KCgoKaW5saW5lIHZvaWQgSW86 Om91dDE2X3AoIFVuc2lnbmVkMTYgdmFsLCB1bnNpZ25lZCBwb3J0ICkKewogIG91dDE2KHZhbCxw b3J0KTsgaW9kZWxheSgpOwp9CgoKaW5saW5lIHZvaWQgSW86Om91dDMyX3AoIFVuc2lnbmVkMzIg dmFsLCB1bnNpZ25lZCBwb3J0ICkKewogIG91dDMyKHZhbCxwb3J0KTsgaW9kZWxheSgpOwp9CgoK CgoKaW5saW5lIHZvaWQgSW86OmlvZGVsYXkoKQp7CiAgYXNtKCJwdXNobCAlZWF4OyBpbmIgJDB4 ODAsJWFsOyBpbmIgJDB4ODAsJWFsOyBwb3BsICVlYXgiKTsKfQoKCgppbmxpbmUgVW5zaWduZWQ4 IElvOjppbjgoIHVuc2lnbmVkIHBvcnQgKQp7CiAgVW5zaWduZWQ4IHRtcDsKICBhc20gdm9sYXRp bGUgKCJpbmIgJXcxLCAlYjAiOiAiPWEiKHRtcCkgOiAiTmQiKHBvcnQpICk7CiAgcmV0dXJuIHRt cDsKfQoKCgppbmxpbmUgVW5zaWduZWQxNiBJbzo6aW4xNiggdW5zaWduZWQgcG9ydCApCnsKICBV bnNpZ25lZDE2IHRtcDsKICBhc20gdm9sYXRpbGUgKCJpbncgJXcxLCAldzAiOiAiPWEiKHRtcCkg OiAiTmQiKHBvcnQpICk7CiAgcmV0dXJuIHRtcDsKfQoKCgppbmxpbmUgVW5zaWduZWQzMiBJbzo6 aW4zMiggdW5zaWduZWQgcG9ydCApCnsKICBVbnNpZ25lZDMyIHRtcDsKICBhc20gdm9sYXRpbGUg KCJpbiAldzEsICUwIjogIj1hIih0bXApIDogIk5kIihwb3J0KSApOwogIHJldHVybiB0bXA7Cn0K CgoKaW5saW5lIHZvaWQgSW86Om91dDgoIFVuc2lnbmVkOCB2YWwsIHVuc2lnbmVkIHBvcnQgKQp7 CiAgYXNtIHZvbGF0aWxlICgib3V0YiAlYjAsICV3MSI6IDogImEiKHZhbCksICJOZCIocG9ydCkg KTsKfQoKCgppbmxpbmUgdm9pZCBJbzo6b3V0MTYoIFVuc2lnbmVkMTYgdmFsLCB1bnNpZ25lZCBw b3J0ICkKewogIGFzbSB2b2xhdGlsZSAoIm91dHcgJXcwLCAldzEiOiA6ICJhIih2YWwpLCAiTmQi KHBvcnQpICk7Cn0KCgoKaW5saW5lIHZvaWQgSW86Om91dDMyKCBVbnNpZ25lZDMyIHZhbCwgdW5z aWduZWQgcG9ydCApCnsKICBhc20gdm9sYXRpbGUgKCJvdXQgJTAsICV3MSI6IDogImEiKHZhbCks ICJOZCIocG9ydCkgKTsKfQojIDIzMCAiYXV0by9waWMuaCIgMgojIDI0NSAiYXV0by9waWMuaCIK aW5saW5lIHZvaWQgUGljOjpkaXNhYmxlKCB1bnNpZ25lZCBpcnFudW0gKQp7CiAgUHJvYzo6U3Rh dHVzIHMgPSBQcm9jOjpjbGlfc2F2ZSgpOwogIGRpc2FibGVfbG9ja2VkKCBpcnFudW0gKTsKICBQ cm9jOjpzdGlfcmVzdG9yZShzKTsKfQoKCgppbmxpbmUgdm9pZCBQaWM6OmVuYWJsZSggdW5zaWdu ZWQgaXJxbnVtICkKewogIFByb2M6OlN0YXR1cyBzID0gUHJvYzo6Y2xpX3NhdmUoKTsKICBlbmFi bGVfbG9ja2VkKCBpcnFudW0gKTsKICBQcm9jOjpzdGlfcmVzdG9yZShzKTsKfQoKCgppbmxpbmUg dm9pZCBQaWM6OmFja25vd2xlZGdlKCB1bnNpZ25lZCBpcnEgKQp7CiAgUHJvYzo6U3RhdHVzIHMg PSBQcm9jOjpjbGlfc2F2ZSgpOwogIGFja25vd2xlZGdlX2xvY2tlZChpcnEpOwogIFByb2M6OnN0 aV9yZXN0b3JlKHMpOwp9CgoKCmlubGluZSB2b2lkIFBpYzo6ZGlzYWJsZV9sb2NrZWQoIHVuc2ln bmVkIGlycSApCnsKICBpZiAoaXJxIDwgOCkKICAgIElvOjpvdXQ4KElvOjppbjgoTUFTVEVSX09D VykgfCAoMSA8PCBpcnEpLCBNQVNURVJfT0NXKTsKICBlbHNlCiAgICBJbzo6b3V0OChJbzo6aW44 KFNMQVZFU19PQ1cpIHwgKDEgPDwgKGlycS04KSksIFNMQVZFU19PQ1cpOwp9CgoKCmlubGluZSB2 b2lkIFBpYzo6ZW5hYmxlX2xvY2tlZCggdW5zaWduZWQgaXJxICkKewogIGlmIChpcnEgPCA4KQog ICAgSW86Om91dDgoSW86OmluOChNQVNURVJfT0NXKSAmIH4oMSA8PCBpcnEpLCBNQVNURVJfT0NX KTsKICBlbHNlCiAgICBJbzo6b3V0OChJbzo6aW44KFNMQVZFU19PQ1cpICYgfigxIDw8IChpcnEt OCkpLCBTTEFWRVNfT0NXKTsKfQoKCgppbmxpbmUgdm9pZCBQaWM6OmFja25vd2xlZGdlX2xvY2tl ZCggdW5zaWduZWQgaXJxICkKewogIGlmIChpcnEgPj0gOCkKICAgIHsKICAgICAgSW86Om91dDgo Tk9OX1NQRUNfRU9JLCBTTEFWRVNfSUNXKTsKICAgICAgSW86Om91dDgoT0NXX1RFTVBMQVRFIHwg UkVBRF9ORVhUX1JEIHwgUkVBRF9JU19PTlJELCBTTEFWRVNfSUNXKTsKICAgICAgaWYgKElvOjpp bjgoU0xBVkVTX0lDVykpCiAgICAgICAgcmV0dXJuOwogICAgfQogIElvOjpvdXQ4KE5PTl9TUEVD X0VPSSwgTUFTVEVSX0lDVyk7Cn0KCgoKaW5saW5lIFBpYzo6U3RhdHVzIFBpYzo6ZGlzYWJsZV9h bGxfc2F2ZSgpCnsKICBTdGF0dXMgczsKICBzID0gSW86OmluOChNQVNURVJfT0NXKTsKICBzIHw9 IElvOjppbjgoU0xBVkVTX09DVykgPDwgODsKICBJbzo6b3V0OCggMHhmZiwgTUFTVEVSX09DVyAp OwogIElvOjpvdXQ4KCAweGZmLCBTTEFWRVNfT0NXICk7CgogIHJldHVybiBzOwp9CgoKCmlubGlu ZSB2b2lkIFBpYzo6cmVzdG9yZV9hbGwoIFN0YXR1cyBzICkKewogIElvOjpvdXQ4KCBzICYgMHgw ZmYsIE1BU1RFUl9PQ1cgKTsKICBJbzo6b3V0OCggKHMgPj4gOCkgJiAweDBmZiwgU0xBVkVTX09D VyApOwp9CiMgNDEgImF1dG8vcnRjLmgiIDIKIyA1MCAiYXV0by9ydGMuaCIKaW5saW5lIHZvaWQK UnRjOjphY2tfcmVzZXQodm9pZCkKewoKCiAgYXNtIHZvbGF0aWxlICgibW92YiAkMHhjLCAlYWxc blx0IgogICAgICAgICAgICAgICAgIm91dGIgJWFsLCQweDcwXG5cdCIKICAgICAgICAgICAgICAg ICJvdXRiICVhbCwkMHg4MFxuXHQiCiAgICAgICAgICAgICAgICAiaW5iICAkMHg3MSwlYWxcblx0 Iik7CgoKICBQaWM6OmFja25vd2xlZGdlX2xvY2tlZCg4KTsKCgoKICBhc20gdm9sYXRpbGUgKCJt b3ZiICQweGMsICVhbFxuXHQiCiAgICAgICAgICAgICAgICAib3V0YiAlYWwsJDB4NzBcblx0Igog ICAgICAgICAgICAgICAgIm91dGIgJWFsLCQweDgwXG5cdCIKICAgICAgICAgICAgICAgICJpbmIg ICQweDcxLCVhbFxuXHQiKTsKfQojIDEyMyAiYXV0by90aW1lci5oIiAyCiMgMTMyICJhdXRvL3Rp bWVyLmgiCmlubGluZSB2b2lkIFRpbWVyOjphY2tub3dsZWRnZSgpCnsKCiAgUGljOjpkaXNhYmxl X2xvY2tlZCg4KTsKICBSdGM6OmFja19yZXNldCgpOwogIFBpYzo6ZW5hYmxlX2xvY2tlZCg4KTsK fQoKCgppbmxpbmUgdm9pZCBUaW1lcjo6ZW5hYmxlKCkKewogIFBpYzo6ZW5hYmxlKDgpOwogIFBp Yzo6ZW5hYmxlKDIpOwp9CgoKCmlubGluZSB2b2lkIFRpbWVyOjpkaXNhYmxlKCkKewogIFBpYzo6 ZGlzYWJsZSg4KTsKfQoKCgoKCgppbmxpbmUgdGltZW91dF90Ojp0aW1lb3V0X3QoKQp7CiAgX2Zs YWd3b3JkID0gMDsKfQoKCgppbmxpbmUgYm9vbAp0aW1lb3V0X3Q6OmlzX3NldCgpCnsKICByZXR1 cm4gX2ZsYWdzLnNldDsKfQoKCgppbmxpbmUgYm9vbAp0aW1lb3V0X3Q6Omhhc19oaXQoKQp7CiAg cmV0dXJuIF9mbGFncy5oaXQ7Cn0KCgoKaW5saW5lIENvbnRleHQgKgp0aW1lb3V0X3Q6Om93bmVy KCkKewogIHJldHVybiBjb250ZXh0X29mICh0aGlzKTsKfQoKCgppbmxpbmUgdm9pZAp0aW1lb3V0 X3Q6OmVucXVldWUoKQp7CiAgX2ZsYWdzLnNldCA9IDE7CiAgaWYgKCF0aW1lcjo6Zmlyc3RfdGlt ZW91dCkKICAgIHsKICAgICAgdGltZXI6OmZpcnN0X3RpbWVvdXQgPSB0aGlzOwogICAgICBfcHJl diA9IF9uZXh0ID0gMDsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHRpbWVvdXRfdCAqdGkgPSB0 aW1lcjo6Zmlyc3RfdGltZW91dDsKCiAgICAgIGZvciAoOzspCiAgICAgICAgewogICAgICAgICAg aWYgKHRpLT5fd2FrZXVwID49IF93YWtldXApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAg X25leHQgPSB0aTsKICAgICAgICAgICAgICBfcHJldiA9IHRpLT5fcHJldjsKICAgICAgICAgICAg ICB0aS0+X3ByZXYgPSB0aGlzOwogICAgICAgICAgICAgIGlmIChfcHJldikKICAgICAgICAgICAg ICAgIF9wcmV2LT5fbmV4dCA9IHRoaXM7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAg ICAgdGltZXI6OmZpcnN0X3RpbWVvdXQgPSB0aGlzOwoKICAgICAgICAgICAgICByZXR1cm47CiAg ICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoISB0aS0+X25leHQpCiAgICAgICAgICAgIGJyZWFr OwoKICAgICAgICAgIHRpID0gdGktPl9uZXh0OwogICAgICAgIH0KCgogICAgICB0aS0+X25leHQg PSB0aGlzOwogICAgICBfcHJldiA9IHRpOwogICAgICBfbmV4dCA9IDA7CiAgICB9Cn0KCgoKaW5s aW5lIHZvaWQKdGltZW91dF90OjpzZXQodW5zaWduZWQgbG9uZyBsb25nIGFic19taWNyb3NlYykK ewoKICBMb2NrX2d1YXJkPENwdV9sb2NrPiBndWFyZCAoJmNwdV9sb2NrKTsKCiAgKCh2b2lkKSAo KCEgaXNfc2V0KCkpID8gMCA6IChfX2Fzc2VydF9mYWlsICgiISBpc19zZXQoKSIsICJhdXRvL3Rp bWVyLmgiLCAyNDEsICgoY29uc3QgY2hhciAqKSAwKSksIDApKSk7CiAgX3dha2V1cCA9IGFic19t aWNyb3NlYzsKICBlbnF1ZXVlKCk7Cn0KCgoKaW5saW5lIHZvaWQKdGltZW91dF90OjpzZXRfYWdh aW4oKQp7CgogIExvY2tfZ3VhcmQ8Q3B1X2xvY2s+IGd1YXJkICgmY3B1X2xvY2spOwoKICAoKHZv aWQpICgoISBpc19zZXQoKSkgPyAwIDogKF9fYXNzZXJ0X2ZhaWwgKCIhIGlzX3NldCgpIiwgImF1 dG8vdGltZXIuaCIsIDI1NCwgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsKICBpZiAoISBoYXNf aGl0KCkpCiAgICB7CiAgICAgIGVucXVldWUoKTsKICAgIH0KfQoKCgppbmxpbmUgdm9pZAp0aW1l b3V0X3Q6OnJlc2V0KCkKewoKCiAgaWYgKCEgaXNfc2V0KCkpCiAgICByZXR1cm47CgogIHsKICAg IExvY2tfZ3VhcmQ8Q3B1X2xvY2s+IGd1YXJkICgmY3B1X2xvY2spOwoKICAgIGlmIChpc19zZXQo KSkKICAgICAgewogICAgICAgIGlmIChfcHJldikKICAgICAgICBfcHJldi0+X25leHQgPSBfbmV4 dDsKICAgICAgICBlbHNlCiAgICAgICAgdGltZXI6OmZpcnN0X3RpbWVvdXQgPSBfbmV4dDsKICAg ICAgICBpZiAoX25leHQpCiAgICAgICAgX25leHQtPl9wcmV2ID0gX3ByZXY7CiAgICAgIH0KCiAg ICBfZmxhZ3Muc2V0ID0gMDsKCiAgfQp9CgoKCmlubGluZSBsb25nIGxvbmcKdGltZW91dF90Ojpn ZXRfdGltZW91dCgpCnsKICByZXR1cm4gX3dha2V1cCAtIGttZW06OmluZm8oKS0+Y2xvY2s7Cn0K CgoKaW5saW5lIGJvb2wKdGltZW91dF90OjpjaGVja19oaXQoKQp7CgoKICBpZiAoa21lbTo6aW5m bygpLT5jbG9jayA8IF93YWtldXApCiAgICByZXR1cm4gZmFsc2U7CgogIHRpbWVyOjpmaXJzdF90 aW1lb3V0ID0gX25leHQ7CiAgaWYgKF9uZXh0KSBfbmV4dC0+X3ByZXYgPSAwOwogIF9mbGFncy5o aXQgPSAxOwogIF9mbGFncy5zZXQgPSAwOwogIG93bmVyKCktPnN0YXRlX2NoYW5nZSh+VGhyZWFk X2lwY19pbl9wcm9ncmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkX3J1bm5pbmcp OwoKCgoKICBvd25lcigpLT5yZWFkeV9lbnF1ZXVlKCk7CgogIHJldHVybiB0cnVlOwp9CgoKCmlu bGluZSB2b2lkCnRpbWVyOjpkb190aW1lb3V0cygpCnsKICB3aGlsZSAoZmlyc3RfdGltZW91dCkK ICAgIHsKICAgICAgaWYgKCEgZmlyc3RfdGltZW91dC0+Y2hlY2tfaGl0KCkpCiAgICAgICAgYnJl YWs7CiAgICB9Cn0KCgoKaW5saW5lIHZvaWQKdGltZXI6OnVwZGF0ZV9zeXN0ZW1fY2xvY2soKQp7 CiAga21lbTo6aW5mbygpLT5jbG9jayArPSBDb25maWc6Om1pY3Jvc2VjX3Blcl90aWNrOwoKICBk b190aW1lb3V0cygpOwp9CiMgOCAiYXV0by9yZWNlaXZlci5oIiAyCgoKCgoKCmNsYXNzIFN5c19p cGNfZnJhbWU7CmNsYXNzIFNlbmRlcjsKY2xhc3MgVGhyZWFkOwojIDI2ICJhdXRvL3JlY2VpdmVy LmgiCmNsYXNzIFJlY2VpdmVyIDogcHVibGljIENvbnRleHQKewoKICBTZW5kZXIqIF9wYXJ0bmVy OwogIFN5c19pcGNfZnJhbWUgKl9yZWNlaXZlX3JlZ3M7CiAgdm1fb2Zmc2V0X3QgX3BhZ2Vpbl9y ZXF1ZXN0OwogIFRocmVhZCogX3BhZ2Vpbl9hcHBsaWNhbnQ7CiAgU2VuZGVyKiBfc2VuZGVyX2Zp cnN0OwoKcHJvdGVjdGVkOgoKCgoKCiAgdGltZW91dF90KiBfdGltZW91dDsKCnB1YmxpYzoKIyA1 MiAiYXV0by9yZWNlaXZlci5oIgogIFN5c19pcGNfZnJhbWUqIHJlY2VpdmVfcmVncygpIGNvbnN0 OwojIDYzICJhdXRvL3JlY2VpdmVyLmgiCiAgdm9pZCBzZXRfcGFnZWluX3JlcXVlc3Qodm1fb2Zm c2V0X3QgYWRkcmVzcywgVGhyZWFkICpub3RpZnkpOwoKCgoKCgoKICBib29sIHNlbmRlcl9vayhT ZW5kZXIqIHNlbmRlcikgY29uc3Q7CgoKCgoKCiAgYm9vbCBpbl9sb25nX2lwYyhTZW5kZXIqIHNl bmRlcikgY29uc3Q7CiMgODggImF1dG8vcmVjZWl2ZXIuaCIKICBpbnQgaXBjX3RyeV9sb2NrKFNl bmRlciogc2VuZGVyKTsKCgogIHZvaWQgaXBjX3VubG9jaygpOwoKCgoKICBTZW5kZXIqKiBzZW5k ZXJfbGlzdCgpOwoKICB2b2lkIHJlc2V0X3JlY2VpdmVfdGltZW91dCgpOwoKcHJvdGVjdGVkOgoj IDEwOSAiYXV0by9yZWNlaXZlci5oIgogIFJlY2VpdmVyKFRocmVhZF9sb2NrICp0aHJlYWRfbG9j aywgU3BhY2VfY29udGV4dCogc3BhY2VfY29udGV4dCk7CgoKCgogIFNlbmRlciogcGFydG5lcigp IGNvbnN0OwoKCgoKCiAgdm9pZCByZXN0b3JlX3JlY2VpdmVyX3N0YXRlKFNlbmRlciogcGFydG5l ciwgU3lzX2lwY19mcmFtZSogcmVncyk7CgoKCgoKICB2b2lkIHNhdmVfcmVjZWl2ZXJfc3RhdGUo U2VuZGVyKiogb3V0X3BhcnRuZXIsIFN5c19pcGNfZnJhbWUqKiBvdXRfcmVncyk7CgoKCiAgdm9p ZCBjbGVhcl9wYWdlaW5fcmVxdWVzdCgpOwoKCgogIHZtX29mZnNldF90IHBhZ2Vpbl9yZXF1ZXN0 KCkgY29uc3Q7CgoKCgogIFRocmVhZCogcGFnZWluX2FwcGxpY2FudCgpOwojIDE0OSAiYXV0by9y ZWNlaXZlci5oIgogIHVuc2lnbmVkIHNldHVwX3JlY2VpdmVyX3N0YXRlKFNlbmRlciogc2VuZGVy LCBTeXNfaXBjX2ZyYW1lKiByZWdzKTsKIyAxNjAgImF1dG8vcmVjZWl2ZXIuaCIKICB2b2lkIHNl dHVwX3JlY2VpdmVyKFNlbmRlciogc2VuZGVyLCBTeXNfaXBjX2ZyYW1lKiByZWdzKTsKCiAgdm9p ZCBzZXRfcmVjZWl2ZV90aW1lb3V0KHRpbWVvdXRfdCAqdCk7Cgpwcml2YXRlOgoKICB2b2lkIHNl dF9yZWNlaXZlX3JlZ3MoU3lzX2lwY19mcmFtZSogcmVncyk7CgogIHZvaWQgc2V0X3BhcnRuZXIo U2VuZGVyKiBwYXJ0bmVyKTsKfTsKCgoKCgoKIyAxICJhdXRvL2w0X2lwYy5oIiAxCiMgMTc3ICJh dXRvL3JlY2VpdmVyLmgiIDIKCgoKCiMgMSAiYXV0by90aHJlYWRfbG9jay5oIiAxCgoKCgoKCgoj IDEgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9wYW5pYy5oIiAxCgoKCgoKZXh0ZXJuICJD IiB7Cgp2b2lkIHBhbmljIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAo KF9fbm9yZXR1cm5fXykpOwoKfQojIDkgImF1dG8vdGhyZWFkX2xvY2suaCIgMgoKCgoKCgplbnVt IFN3aXRjaF9oaW50CnsKICBTV0lUQ0hfRE9OVF9DQVJFID0gMCwKICBTV0lUQ0hfQUNUSVZBVEVf UkVDRUlWRVIsCiAgU1dJVENIX0FDVElWQVRFX1NFTkRFUgp9OwojIDMxICJhdXRvL3RocmVhZF9s b2NrLmgiCmNsYXNzIFRocmVhZF9sb2NrCnsKcHJpdmF0ZToKICBTd2l0Y2hfbG9jayBfc3dpdGNo X2xvY2s7CiAgU3dpdGNoX2hpbnQgX3N3aXRjaF9oaW50OwoKcHVibGljOgoKCgogIHZvaWQgc2V0 X3N3aXRjaF9oaW50KFN3aXRjaF9oaW50IGhpbnQpOwoKCgoKICBib29sIHRlc3RfYW5kX3NldCgp OwoKCgoKCiAgdm9pZCBsb2NrKCk7CgoKCgoKCgogIHZvaWQgY2xlYXIoKTsKCgoKCiAgQ29udGV4 dCAqIGxvY2tfb3duZXIoKSBjb25zdDsKCgoKCiAgYm9vbCB0ZXN0KCk7Cgpwcml2YXRlOgoKCgog IENvbnRleHQqIGNvbnRleHQoKSBjb25zdDsKfTsKIyA5NiAiYXV0by90aHJlYWRfbG9jay5oIgpp bmxpbmUgdm9pZApUaHJlYWRfbG9jazo6c2V0X3N3aXRjaF9oaW50KFN3aXRjaF9oaW50IGhpbnQp CnsKICBfc3dpdGNoX2hpbnQgPSBoaW50Owp9CgoKCgoKCgppbmxpbmUgdm9pZApUaHJlYWRfbG9j azo6bG9jaygpCnsKICAoKHZvaWQpICgodGVzdF9hbmRfc2V0ICgpID09IGZhbHNlKSA/IDAgOiAo X19hc3NlcnRfZmFpbCAoInRlc3RfYW5kX3NldCAoKSA9PSBmYWxzZSIsICJhdXRvL3RocmVhZF9s b2NrLmgiLCAxMTEsICgoY29uc3QgY2hhciAqKSAwKSksIDApKSk7Cn0KCgoKCgoKaW5saW5lIENv bnRleHQgKgpUaHJlYWRfbG9jazo6bG9ja19vd25lcigpIGNvbnN0CnsKICByZXR1cm4gX3N3aXRj aF9sb2NrLmxvY2tfb3duZXIoKTsKfQoKCgoKCgppbmxpbmUgYm9vbApUaHJlYWRfbG9jazo6dGVz dCgpCnsKICByZXR1cm4gX3N3aXRjaF9sb2NrLnRlc3QoKTsKfQojIDE4MiAiYXV0by9yZWNlaXZl ci5oIiAyCiMgMjAwICJhdXRvL3JlY2VpdmVyLmgiCmlubGluZSBTeXNfaXBjX2ZyYW1lKgpSZWNl aXZlcjo6cmVjZWl2ZV9yZWdzKCkgY29uc3QKewogICgodm9pZCkgKChzdGF0ZSAoKSAmIFRocmVh ZF9pcGNfcmVjZWl2aW5nX21hc2spID8gMCA6IChfX2Fzc2VydF9mYWlsICgic3RhdGUgKCkgJiBU aHJlYWRfaXBjX3JlY2VpdmluZ19tYXNrIiwgImF1dG8vcmVjZWl2ZXIuaCIsIDIwMywgKChjb25z dCBjaGFyICopIDApKSwgMCkpKTsKCiAgcmV0dXJuIF9yZWNlaXZlX3JlZ3M7Cn0KIyAyMTkgImF1 dG8vcmVjZWl2ZXIuaCIKaW5saW5lIHZvaWQKUmVjZWl2ZXI6OnNldF9wYWdlaW5fcmVxdWVzdCh2 bV9vZmZzZXRfdCBhZGRyZXNzLCBUaHJlYWQgKm5vdGlmeSkKewogICgodm9pZCkgKChhZGRyZXNz ICE9IDB4ZmZmZmZmZmYpID8gMCA6IChfX2Fzc2VydF9mYWlsICgiYWRkcmVzcyAhPSAweGZmZmZm ZmZmIiwgImF1dG8vcmVjZWl2ZXIuaCIsIDIyMiwgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsK CiAgX3BhZ2Vpbl9yZXF1ZXN0ID0gYWRkcmVzczsKICBfcGFnZWluX2FwcGxpY2FudCA9IG5vdGlm eTsKCiAgc3RhdGVfY2hhbmdlICh+VGhyZWFkX2J1c3lfbG9uZywgVGhyZWFkX3J1bm5pbmcpOwp9 CgoKCgoKCmlubGluZSBTZW5kZXIqClJlY2VpdmVyOjpwYXJ0bmVyKCkgY29uc3QKewogIHJldHVy biBfcGFydG5lcjsKfQojIDI0OSAiYXV0by9yZWNlaXZlci5oIgppbmxpbmUgYm9vbApSZWNlaXZl cjo6c2VuZGVyX29rKFNlbmRlciogc2VuZGVyKSBjb25zdAp7CiAgdW5zaWduZWQgaXBjX3N0YXRl ID0gc3RhdGUoKSAmIChUaHJlYWRfcmVjZWl2aW5nfFRocmVhZF93YWl0aW5nCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IFRocmVhZF9zZW5kX2luX3Byb2dyZXNzCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRocmVhZF9pcGNfaW5fcHJvZ3Jlc3MpOwoKCiAg aWYgKCEgKGlwY19zdGF0ZSA9PSAoVGhyZWFkX3dhaXRpbmcgfCBUaHJlYWRfaXBjX2luX3Byb2dy ZXNzKSkKICAgICAgJiYgKCEgKChpcGNfc3RhdGUgPT0gKFRocmVhZF9yZWNlaXZpbmcgfCBUaHJl YWRfaXBjX2luX3Byb2dyZXNzKSkKICAgICAgICAgICAgICYmIHBhcnRuZXIoKSA9PSBzZW5kZXIp KSkKICAgIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICByZXR1cm4gdHJ1ZTsKfQojIDI3 NCAiYXV0by9yZWNlaXZlci5oIgppbmxpbmUgYm9vbApSZWNlaXZlcjo6aW5fbG9uZ19pcGMoU2Vu ZGVyKiBzZW5kZXIpIGNvbnN0CnsKICBpZiAoKChzdGF0ZSgpICYgKFRocmVhZF9yY3Zsb25nX2lu X3Byb2dyZXNzfFRocmVhZF9pcGNfaW5fcHJvZ3Jlc3MpKQogICAgICAgIT0gKFRocmVhZF9yY3Zs b25nX2luX3Byb2dyZXNzfFRocmVhZF9pcGNfaW5fcHJvZ3Jlc3MpKQogICAgICB8fCBwYXJ0bmVy KCkgIT0gc2VuZGVyKQogICAgcmV0dXJuIGZhbHNlOwoKICByZXR1cm4gdHJ1ZTsKfQoKCgppbmxp bmUgdm9pZApSZWNlaXZlcjo6c2V0X3BhcnRuZXIoU2VuZGVyKiBwYXJ0bmVyKQp7CiAgX3BhcnRu ZXIgPSBwYXJ0bmVyOwp9CgoKCgoKaW5saW5lIHZvaWQKUmVjZWl2ZXI6OmNsZWFyX3BhZ2Vpbl9y ZXF1ZXN0KCkKewogIF9wYWdlaW5fcmVxdWVzdCA9IDB4ZmZmZmZmZmY7Cn0KIyAzMTQgImF1dG8v cmVjZWl2ZXIuaCIKaW5saW5lIGludApSZWNlaXZlcjo6aXBjX3RyeV9sb2NrKFNlbmRlciogc2Vu ZGVyKQp7CiAgaWYgKHN0YXRlICgpID09IFRocmVhZF9pbnZhbGlkKQogICAgcmV0dXJuIDB4MTA7 CgogIHRocmVhZF9sb2NrKCktPmxvY2soKTsKCiAgaWYgKCEgc2VuZGVyX29rIChzZW5kZXIpKQog ICAgewogICAgICB0aHJlYWRfbG9jaygpLT5jbGVhcigpOwogICAgICByZXR1cm4gLTE7CiAgICB9 CgogIHNldF9wYXJ0bmVyIChzZW5kZXIpOwogIHJlY2VpdmVfcmVncygpLT5yY3Zfc291cmNlKCBz ZW5kZXItPmlkKCkgKTsKICBjbGVhcl9wYWdlaW5fcmVxdWVzdCAoKTsKCiAgcmV0dXJuIDA7Cn0K CgoKCmlubGluZSB2b2lkClJlY2VpdmVyOjppcGNfdW5sb2NrKCkKewogICgodm9pZCkgKCh0aHJl YWRfbG9jaygpLT5sb2NrX293bmVyKCkgPT0gY3VycmVudCgpKSA/IDAgOiAoX19hc3NlcnRfZmFp bCAoInRocmVhZF9sb2NrKCktPmxvY2tfb3duZXIoKSA9PSBjdXJyZW50KCkiLCAiYXV0by9yZWNl aXZlci5oIiwgMzQxLCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwoKICB0aHJlYWRfbG9jaygp LT5jbGVhcigpOwp9CgoKCgoKCmlubGluZSBTZW5kZXIqKgpSZWNlaXZlcjo6c2VuZGVyX2xpc3Qo KQp7CiAgcmV0dXJuICZfc2VuZGVyX2ZpcnN0Owp9CgoKCmlubGluZSB2b2lkClJlY2VpdmVyOjpy ZXNldF9yZWNlaXZlX3RpbWVvdXQoKQp7CiAgaWYgKF90aW1lb3V0KQogICAgewogICAgICBfdGlt ZW91dC0+cmVzZXQoKTsKICAgICAgX3RpbWVvdXQgPSAwOwogICAgfQp9CiMgMzc5ICJhdXRvL3Jl Y2VpdmVyLmgiCmlubGluZSBSZWNlaXZlcjo6UmVjZWl2ZXIoVGhyZWFkX2xvY2sgKnRocmVhZF9s b2NrLAogICAgICAgICAgICAgICAgICAgU3BhY2VfY29udGV4dCogc3BhY2VfY29udGV4dCkKICA6 IENvbnRleHQgKHRocmVhZF9sb2NrLCBzcGFjZV9jb250ZXh0KQp7fQoKCgoKaW5saW5lIHZvaWQK UmVjZWl2ZXI6OnNldF9yZWNlaXZlX3JlZ3MoU3lzX2lwY19mcmFtZSogcmVncykKewogIF9yZWNl aXZlX3JlZ3MgPSByZWdzOwp9CgoKCgoKCgppbmxpbmUgdm9pZApSZWNlaXZlcjo6cmVzdG9yZV9y ZWNlaXZlcl9zdGF0ZShTZW5kZXIqIHBhcnRuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBTeXNfaXBjX2ZyYW1lKiByZWdzKQp7CiAgc2V0X3BhcnRuZXIgKHBhcnRuZXIpOwog IHNldF9yZWNlaXZlX3JlZ3MgKHJlZ3MpOwp9CgoKCgoKCgppbmxpbmUgdm9pZApSZWNlaXZlcjo6 c2F2ZV9yZWNlaXZlcl9zdGF0ZShTZW5kZXIqKiBvdXRfcGFydG5lciwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFN5c19pcGNfZnJhbWUqKiBvdXRfcmVncykKewogICpvdXRfcGFydG5l ciA9IF9wYXJ0bmVyOwogICpvdXRfcmVncyA9IF9yZWNlaXZlX3JlZ3M7Cn0KCgoKCgppbmxpbmUg dm1fb2Zmc2V0X3QKUmVjZWl2ZXI6OnBhZ2Vpbl9yZXF1ZXN0KCkgY29uc3QKewogIHJldHVybiBf cGFnZWluX3JlcXVlc3Q7Cn0KCgoKCgoKaW5saW5lIFRocmVhZCoKUmVjZWl2ZXI6OnBhZ2Vpbl9h cHBsaWNhbnQoKQp7CiAgcmV0dXJuIF9wYWdlaW5fYXBwbGljYW50Owp9CiMgNDUyICJhdXRvL3Jl Y2VpdmVyLmgiCmlubGluZSB1bnNpZ25lZApSZWNlaXZlcjo6c2V0dXBfcmVjZWl2ZXJfc3RhdGUo U2VuZGVyKiBzZW5kZXIsIFN5c19pcGNfZnJhbWUqIHJlZ3MpCnsKICBzZXRfcmVjZWl2ZV9yZWdz IChyZWdzKTsKCiAgaWYgKHNlbmRlcikKICAgIHsKICAgICAgc2V0X3BhcnRuZXIgKHNlbmRlcik7 CiAgICAgIHJldHVybiBUaHJlYWRfcmVjZWl2aW5nOwogICAgfQogIGVsc2UKICAgIHsKICAgICAg cmV0dXJuIFRocmVhZF93YWl0aW5nOwogICAgfQp9CiMgNDc5ICJhdXRvL3JlY2VpdmVyLmgiCmlu bGluZSB2b2lkClJlY2VpdmVyOjpzZXR1cF9yZWNlaXZlcihTZW5kZXIqIHNlbmRlciwgU3lzX2lw Y19mcmFtZSogcmVncykKewogIHN0YXRlX2FkZCAoc2V0dXBfcmVjZWl2ZXJfc3RhdGUoc2VuZGVy LCByZWdzKSk7Cn0KCgoKaW5saW5lIHZvaWQKUmVjZWl2ZXI6OnNldF9yZWNlaXZlX3RpbWVvdXQo dGltZW91dF90ICp0KQp7CiAgX3RpbWVvdXQgPSB0Owp9CiMgMTUgImF1dG8vdGhyZWFkLmgiIDIK CgoKCgoKCmNsYXNzIHRpbWVvdXRfdDsKY2xhc3MgaXJxX3Q7CmNsYXNzIFJldHVybl9mcmFtZTsK Y2xhc3MgU3lzY2FsbF9mcmFtZTsKY2xhc3MgRW50cnlfZnJhbWU7CmNsYXNzIFN5c19pcGNfZnJh bWU7CgpjbGFzcyB0cmFwX3N0YXRlOwoKCgpjbGFzcyBUaHJlYWQgOiBwdWJsaWMgUmVjZWl2ZXIs IHB1YmxpYyBTZW5kZXIKewpwcml2YXRlOgogIFRocmVhZChjb25zdCBUaHJlYWQmKTsKICB2b2lk ICpvcGVyYXRvciBuZXcoc2l6ZV90KTsKCnByb3RlY3RlZDoKCgoKCgogICAgICAgICAgICAgU3Bh Y2UqIF9zcGFjZTsKICAgICAgICAgICAgIFRocmVhZF9sb2NrIF90aHJlYWRfbG9jazsKCgogIFRo cmVhZCAqX3BhZ2VyLCAqX3ByZWVtcHRlciwgKl9leHRfcHJlZW1wdGVyOwoKICBUaHJlYWQgKnBy ZXNlbnRfbmV4dCwgKnByZXNlbnRfcHJldjsKICBpcnFfdCAqX2lycTsKCiAgeDg2X2dhdGUgKl9p ZHQ7CiAgdW5zaWduZWQgc2hvcnQgX2lkdF9saW1pdDsKCgogIEw0X3Jjdl9kZXNjIF90YXJnZXRf ZGVzYzsKICB1bnNpZ25lZCBfcGFnZWluX2Vycm9yX2NvZGU7CgogIHZtX29mZnNldF90IF92bV93 aW5kb3cwLCBfdm1fd2luZG93MTsKCiAgam1wX2J1ZiAqX3JlY292ZXJfam1wYnVmOwogIEw0X3Rp bWVvdXQgX3BmX3RpbWVvdXQ7CgoKICB2bV9vZmZzZXRfdCBfbGFzdF9wZl9hZGRyZXNzOwogIHVu c2lnbmVkIF9sYXN0X3BmX2Vycm9yX2NvZGU7CgogIHVuc2lnbmVkIF9tYWdpYzsKICBzdGF0aWMg Y29uc3QgdW5zaWduZWQgbWFnaWMgPSAweGYwMDFjMDAxOwoKICBzdGF0aWMgaW50ICgqbmVzdGVk X3RyYXBfaGFuZGxlcikodHJhcF9zdGF0ZSAqc3RhdGUpOwoKCiAgVGhyZWFkIChTcGFjZSogc3Bh Y2UsIEw0X3VpZCBpZCk7CgpwdWJsaWM6CgoKICBUaHJlYWQgKFNwYWNlKiBzcGFjZSwgTDRfdWlk IGlkLAogICAgICAgICAgaW50IGluaXRfcHJpbywgdW5zaWduZWQgc2hvcnQgbWNwKTsKCiAgTXdv cmQgc3lzX2lwYyAoU3lzY2FsbF9mcmFtZSAqcmVncyk7CiAgTXdvcmQgc3lzX2lkX25lYXJlc3Qg KFN5c2NhbGxfZnJhbWUgKnJlZ3MpOwogIE13b3JkIHN5c19mcGFnZV91bm1hcCAoU3lzY2FsbF9m cmFtZSAqcmVncyk7CiAgTXdvcmQgc3lzX3RocmVhZF9zd2l0Y2ggKFN5c2NhbGxfZnJhbWUgKnJl Z3MpOwogIE13b3JkIHN5c190aHJlYWRfc2NoZWR1bGUgKFN5c2NhbGxfZnJhbWUgKnJlZ3MpOwog IE13b3JkIHN5c190aHJlYWRfZXhfcmVncyAoU3lzY2FsbF9mcmFtZSAqcmVncyk7CiAgTXdvcmQg c3lzX3Rhc2tfbmV3IChTeXNjYWxsX2ZyYW1lICpyZWdzKTsKcHJpdmF0ZToKCnByaXZhdGU6CiAg Ym9vbCBpcGNfc2hvcnRfY3V0KCBTeXNfaXBjX2ZyYW1lKikgYXNtICgiY2FsbF9pcGNfc2hvcnRf Y3V0Iik7CnByaXZhdGU6Cgpwcm90ZWN0ZWQ6CiAgZnJpZW5kIGNsYXNzIGpkYjsKICBmcmllbmQg Y2xhc3MgamRiX3RocmVhZF9saXN0OwoKcHVibGljOgoKCgoKCgogIHZvaWQgKiBvcGVyYXRvciBu ZXcoc2l6ZV90LCB0aHJlYWRpZF90IGlkKTsKCgoKCiAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9p ZCAqKTsKIyAxMjIgImF1dG8vdGhyZWFkLmgiCiAgdmlydHVhbCB+VGhyZWFkKCk7CgoKCgoKICBz dGF0aWMgVGhyZWFkKiBsb29rdXAoQ29udGV4dCogYyk7CiMgMTM4ICJhdXRvL3RocmVhZC5oIgog IFNwYWNlX2luZGV4IHNwYWNlX2luZGV4KCkgY29uc3Q7CgoKCgoKICBTcGFjZV9pbmRleCBjaGll Zl9pbmRleCgpIGNvbnN0OwoKCgoKICBTcGFjZSAqIHNwYWNlKCkgY29uc3Q7CgoKCgoKCiAgVGhy ZWFkX2xvY2sgKiB0aHJlYWRfbG9jaygpOwojIDE3MyAiYXV0by90aHJlYWQuaCIKICBib29sIGlu aXRpYWxpemUodm1fb2Zmc2V0X3QgZWlwLCB2bV9vZmZzZXRfdCBlc3AsIFRocmVhZCogcGFnZXIs IFRocmVhZCogcHJlZW1wdGVyLCB2bV9vZmZzZXRfdCAqb19laXAgPSAwLCB2bV9vZmZzZXRfdCAq b19lc3AgPSAwLCBUaHJlYWQqICpvX3BhZ2VyID0gMCwgVGhyZWFkKiAqb19wcmVlbXB0ZXIgPSAw LCB2bV9vZmZzZXRfdCAqb19lZmxhZ3MgPSAwKTsKIyAxODcgImF1dG8vdGhyZWFkLmgiCiAgYm9v bCBzZXRfc2NoZWRfcGFyYW0obDRfc2NoZWRfcGFyYW1fdCBwYXJhbSwgVGhyZWFkKiBleHRfcHJl ZW1wdGVyLCBsNF9zY2hlZF9wYXJhbV90ICpvX3BhcmFtLCBVbnNpZ25lZDY0ICp0aW1lLCBUaHJl YWQgKipvX2V4dF9wcmVlbXB0ZXIsIFNlbmRlciAqKmlwY3BhcnRuZXIpOwojIDE5OCAiYXV0by90 aHJlYWQuaCIKICBib29sIHJhaXNlX2V4Y2VwdGlvbih0cmFwX3N0YXRlICp0cywgdm1fb2Zmc2V0 X3QgaGFuZGxlcik7CiMgMjA4ICJhdXRvL3RocmVhZC5oIgogIGJvb2wga2lsbF90YXNrKFNwYWNl X2luZGV4IHN1YnRhc2spOwoKCgoKICB1bnNpZ25lZCBuZXN0KCkgY29uc3Q7CiMgMjIzICJhdXRv L3RocmVhZC5oIgogIHZpcnR1YWwgdm9pZCBpcGNfcmVjZWl2ZXJfcmVhZHkoKTsKIyAyMzMgImF1 dG8vdGhyZWFkLmgiCiAgdW5zaWduZWQgaXBjX2NvbnRpbnVlKHVuc2lnbmVkIGlwY19jb2RlKTsK CiAgYm9vbCBoYW5kbGVfc2xvd190cmFwKHRyYXBfc3RhdGUgKnRzKTsKIyAyNTAgImF1dG8vdGhy ZWFkLmgiCiAgYm9vbCBoYW5kbGVfcGFnZV9mYXVsdCh2bV9vZmZzZXRfdCBwZmEsIHVuc2lnbmVk IGVycm9yX2NvZGUsIHVuc2lnbmVkIGVpcCk7CgogIHZvaWQgc3lzY2FsbF9sb2coU3lzY2FsbF9m cmFtZSAqICwgdW5zaWduZWQgbnVtYmVyLAogIGJvb2wgZW50ZXIsIHVuc2lnbmVkIHJldHZhbCk7 CgoKCgoKCiAgTXdvcmQgc3lzX2lwY19sb2coU3lzY2FsbF9mcmFtZSAqaV9yZWdzKTsKCgoKCiAg dW5zaWduZWQgc3lzX2lwY190cmFjZShTeXNjYWxsX2ZyYW1lICppX3JlZ3MpOwoKCiAgdW5zaWdu ZWQgc3lzX2ZwYWdlX3VubWFwX2xvZyhTeXNjYWxsX2ZyYW1lICpyZWdzKTsKCnByb3RlY3RlZDoK IyAyODIgImF1dG8vdGhyZWFkLmgiCiAgdm9pZCBzZXR1cF9pcGNfd2luZG93KHVuc2lnbmVkIHdp biwgdm1fb2Zmc2V0X3QgYWRkcmVzcyk7CgoKCgogIGJvb2wgaW5fcHJlc2VudF9saXN0KCk7CgoK CgoKICB2b2lkIHByZXNlbnRfZW5xdWV1ZShUaHJlYWQgKnNpYmxpbmcpOwoKCgoKICB2b2lkIHBy ZXNlbnRfZGVxdWV1ZSgpOwoKCgoKICBzdGF0aWMgdm9pZCB1c2VyX2ludm9rZSgpOwoKcHJpdmF0 ZToKCgoKCgoKICBib29sIGtpbGwoKTsKIyAzMjMgImF1dG8vdGhyZWFkLmgiCiAgTXdvcmQgaXBj X3NlbmRfcmVncyhUaHJlYWQqIHJlY2VpdmVyLCBTeXNfaXBjX2ZyYW1lIGNvbnN0ICpzZW5kZXJf cmVncyk7CiMgMzMyICJhdXRvL3RocmVhZC5oIgogIE13b3JkIGRvX3NlbmQoVGhyZWFkICpwYXJ0 bmVyLCBMNF90aW1lb3V0IHQsIFN5c19pcGNfZnJhbWUgKnJlZ3MpOwojIDM0MSAiYXV0by90aHJl YWQuaCIKICB2b2lkIHByZXBhcmVfcmVjZWl2ZShTZW5kZXIgKnBhcnRuZXIsIFN5c19pcGNfZnJh bWUgKnJlZ3MpOwojIDM1MyAiYXV0by90aHJlYWQuaCIKICBNd29yZCBkb19yZWNlaXZlKFNlbmRl ciAqc2VuZGVyLCBMNF90aW1lb3V0IHQsIFN5c19pcGNfZnJhbWUgKnJlZ3MpOwoKCgoKCgoKICB1 bnNpZ25lZCBoYW5kbGVfcGFnZV9mYXVsdF9wYWdlcih2bV9vZmZzZXRfdCBwZmEsIHVuc2lnbmVk IGVycm9yX2NvZGUpOwojIDM3MCAiYXV0by90aHJlYWQuaCIKICB1bnNpZ25lZCBoYW5kbGVfaXBj X3BhZ2VfZmF1bHQodm1fb2Zmc2V0X3QgcGZhKTsKIyAzODIgImF1dG8vdGhyZWFkLmgiCiAgdW5z aWduZWQgaXBjX3NlbmRfZnBhZ2UoVGhyZWFkKiByZWNlaXZlciwgTDRfZnBhZ2UgZnJvbV9mcGFn ZSwgTDRfZnBhZ2UgdG9fZnBhZ2UsIHZtX29mZnNldF90IG9mZnNldCwgYm9vbCBmaW5pc2gpOwoK CgoKCgogIHVuc2lnbmVkIGlwY19maW5pc2goVGhyZWFkKiByZWNlaXZlciwgdW5zaWduZWQgbmV3 X3N0YXRlKTsKIyAzOTkgImF1dG8vdGhyZWFkLmgiCiAgdW5zaWduZWQgaXBjX3BhZ2Vpbl9yZXF1 ZXN0KFJlY2VpdmVyKiByZWNlaXZlciwgdm1fb2Zmc2V0X3QgYWRkcmVzcyk7CiMgNDE0ICJhdXRv L3RocmVhZC5oIgogIGJvb2wgZ2V0X2lvcG9ydCh2bV9vZmZzZXRfdCBlaXAsIHRyYXBfc3RhdGUg KiB0cywgdW5zaWduZWQgKiBwb3J0LCB1bnNpZ25lZCAqIHNpemUpOwojIDQyOSAiYXV0by90aHJl YWQuaCIKICB1bnNpZ25lZCBkb19zZW5kX2xvbmcoVGhyZWFkICpwYXJ0bmVyLAogIFN5c19pcGNf ZnJhbWUgKnJlZ3MpOwoKICBzdGF0aWMgdm9pZCBob29rX2lwY192ZWN0b3IoKTsKCiAgc3RhdGlj IHZvaWQgcmVzdG9yZV9pcGNfdmVjdG9yKCk7CgoKCgogIHZvaWQgcGFnZV9mYXVsdF9sb2codm1f b2Zmc2V0X3QgcGZhLCB1bnNpZ25lZCBlcnJvcl9jb2RlLCB1bnNpZ25lZCBlaXApOwoKICBzdGF0 aWMgdm9pZCBob29rX3VubWFwX3ZlY3RvcigpOwoKICBzdGF0aWMgdm9pZCByZXN0b3JlX3VubWFw X3ZlY3RvcigpOwp9OwoKZXh0ZXJuIHVuc2lnbmVkIChUaHJlYWQ6OipzeXNjYWxsX3RhYmxlW10p KFN5c2NhbGxfZnJhbWUgKnJlZ3MpOwoKZXh0ZXJuIGJvb2wgbG9nX2lwYzsKZXh0ZXJuIGJvb2wg bG9nX2lwY190b19idWY7CmV4dGVybiBib29sIGxvZ19pcGNfcmVzdWx0OwpleHRlcm4gYm9vbCBs b2dfcGFnZV9mYXVsdDsKZXh0ZXJuIGJvb2wgbG9nX3BmX3RvX2J1ZjsKZXh0ZXJuIGJvb2wgbG9n X3VubWFwOwpleHRlcm4gYm9vbCBsb2dfdW5tYXBfdG9fYnVmOwpleHRlcm4gYm9vbCB0cmFjZV9p cGM7CmV4dGVybiBib29sIHNsb3dfaXBjOwoKCgoKVGhyZWFkKiBjdXJyZW50X3RocmVhZCgpOwoj IDQ3MCAiYXV0by90aHJlYWQuaCIKZXh0ZXJuICJDIiBpbnQgdGhyZWFkX2hhbmRsZV90cmFwKHRy YXBfc3RhdGUgKnN0YXRlKTsKCmV4dGVybiAiQyIgdm9pZCB0aHJlYWRfdGltZXJfaW50ZXJydXB0 KHZvaWQpOwoKCgoKZXh0ZXJuICJDIiBNd29yZCBkaXNwYXRjaF9zeXNjYWxsKFRocmVhZCAqdCwg RW50cnlfZnJhbWUgKnJlZ3MsIHVuc2lnbmVkIGludCBudW1iZXIpOwoKdm9pZCB0aHJlYWRfdGlt ZXJfaW50ZXJydXB0X2FyY2godm9pZCk7CgoKCmV4dGVybiAiQyIgdm9pZCB0aHJlYWRfdGltZXJf aW50ZXJydXB0X3N0b3Aodm9pZCk7CgoKCgoKZXh0ZXJuICJDIiB2b2lkIHRocmVhZF90aW1lcl9p bnRlcnJ1cHRfc2xvdyh2b2lkKTsKIyA1MDAgImF1dG8vdGhyZWFkLmgiCmV4dGVybiAiQyIgaW50 IHRocmVhZF9wYWdlX2ZhdWx0KGNvbnN0IHZtX29mZnNldF90IHBmYSwgY29uc3QgdW5zaWduZWQg ZXJyb3JfY29kZSwgY29uc3QgdW5zaWduZWQgLApjb25zdCB1bnNpZ25lZCAsCmNvbnN0IHVuc2ln bmVkICwKY29uc3QgdW5zaWduZWQgLApjb25zdCB1bnNpZ25lZCBlaXAsIGNvbnN0IHVuc2lnbmVk ICwKY29uc3QgdW5zaWduZWQgZWZsYWdzKTsKCmV4dGVybiAiQyIgdm9pZCB0aHJlYWRfc3lzY2Fs bF9sb2dfYmVnaW4oVGhyZWFkICp0LCBTeXNjYWxsX2ZyYW1lICpyZWdzLCB1bnNpZ25lZCBudW1i ZXIpOwoKZXh0ZXJuICJDIiB2b2lkIHRocmVhZF9zeXNjYWxsX2xvZ19lbmQodW5zaWduZWQgcmV0 dmFsLCBUaHJlYWQgKnQsIFN5c2NhbGxfZnJhbWUgKnJlZ3MsIHVuc2lnbmVkIG51bWJlcik7CiMg NTE4ICJhdXRvL3RocmVhZC5oIgojIDEgIi4uL3NyYy9rZXJuL2lhMzIvbG9nZGVmcy5oIiAxCgoK CgoKIyAxICJhdXRvL2pkYl90YnVmLmgiIDEKCgoKCgoKIyAxICJhdXRvL2pkYl9rdHJhY2UuaCIg MQojIDE1ICJhdXRvL2pkYl9rdHJhY2UuaCIKZW51bSB7CiAgTE9HX0VWRU5UX01BWF9FVkVOVFMg PSAxNiwKfTsKCnN0cnVjdCBsNF90cmFjZWJ1ZmZlcl9zdGF0dXNfdAp7CiAgVW5zaWduZWQzMiB0 cmFjZWJ1ZmZlcjA7CiAgVW5zaWduZWQzMiBzaXplMDsKICBVbnNpZ25lZDMyIHZlcnNpb24wOwog IFVuc2lnbmVkMzIgdHJhY2VidWZmZXIxOwogIFVuc2lnbmVkMzIgc2l6ZTE7CiAgVW5zaWduZWQz MiB2ZXJzaW9uMTsKICBVbnNpZ25lZDMyIGxvZ2V2ZW50c1tMT0dfRVZFTlRfTUFYX0VWRU5UU107 Cn07CgplbnVtIHsKICBMT0dfRVZFTlRfQ09OVEVYVF9TV0lUQ0ggPSAwLAogIExPR19FVkVOVF9J UENfU0hPUlRDVVQgPSAxLAogIExPR19FVkVOVF9JUlFfUkFJU0VEID0gMiwKICBMT0dfRVZFTlRf VElNRVJfSVJRID0gMywKICBMT0dfRVZFTlRfVEhSRUFEX0VYX1JFR1MgPSA0LAp9OwojIDggImF1 dG8vamRiX3RidWYuaCIgMgoKCgoKCgpjbGFzcyBMb2dfZXZlbnQ7CmNsYXNzIENvbnRleHQ7CiMg MzMgImF1dG8vamRiX3RidWYuaCIKY2xhc3MgamRiX3RidWYKewpwdWJsaWM6CiAgdHlwZWRlZiBz dHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgIHsKICAgICAgdW5zaWduZWQgbnVtYmVy OwogICAgICB1bnNpZ25lZCBlaXA7CiAgICAgIENvbnRleHQgKmN1cnJlbnQ7CiAgICAgIHVuc2ln bmVkIGxvbmcgbG9uZyB0c2M7CiAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBwbWM7CiAgICAgIHVu aW9uIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCiAgICAgICAgewogICAgICAgICAgc3RydWN0IF9f YXR0cmlidXRlX18oKHBhY2tlZCkpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgdW5zaWdu ZWQgZWF4LCBlZHgsIGVieCwgZWJwOwogICAgICAgICAgICAgIFVuc2lnbmVkNjQgZGVzdDsKICAg ICAgICAgICAgfSBpcGM7CiAgICAgICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkK ICAgICAgICAgICAgewoKICAgICAgICAgICAgICB1bnNpZ25lZCBlYXgsIGVkeCwgZWJ4OwogICAg ICAgICAgICAgIHVuc2lnbmVkIG9yaWdfZWJwOwogICAgICAgICAgICAgIFVuc2lnbmVkNjQgc3Jj OwogICAgICAgICAgICAgIHVuc2lnbmVkIHJlZl9ldmVudDsKICAgICAgICAgICAgICBjaGFyIGhh dmVfc2VuZDsKICAgICAgICAgICAgfSBpcGNfcmVzOwogICAgICAgICAgc3RydWN0IF9fYXR0cmli dXRlX18oKHBhY2tlZCkpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgdW5zaWduZWQgbG9u ZyBsb25nIHNlbmRfdHNjOwogICAgICAgICAgICAgIFVuc2lnbmVkNjQgc2VuZF9lc2lfZWRpOwog ICAgICAgICAgICAgIFVuc2lnbmVkNjQgcmVjdl9lc2lfZWRpOwogICAgICAgICAgICAgIGw0X21z Z2RvcGVfdCBkb3BlOwogICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgc2VuZF9kZXNjLCByZWN2 X2Rlc2M7CiAgICAgICAgICAgIH0gaXBjX3RyYWNlOwogICAgICAgICAgc3RydWN0IF9fYXR0cmli dXRlX18oKHBhY2tlZCkpCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgdW5zaWduZWQgcGZh OwogICAgICAgICAgICAgIHVuc2lnbmVkIGVycjsKICAgICAgICAgICAgfSBwZjsKICAgICAgICAg IHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQogICAgICAgICAgICB7CgogICAgICAgICAg ICAgIGNoYXIgbXNnWzM1XTsKICAgICAgICAgICAgfSBrZTsKICAgICAgICAgIHN0cnVjdCBfX2F0 dHJpYnV0ZV9fKChwYWNrZWQpKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgIHVuc2lnbmVk IGVheCwgZWR4LCBlY3g7CiAgICAgICAgICAgICAgY2hhciBtc2dbMjNdOwogICAgICAgICAgICB9 IGtlX3JlZzsKICAgICAgICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQogICAgICAg ICAgICB7CgogICAgICAgICAgICAgIE13b3JkIGZwYWdlOwogICAgICAgICAgICAgIHVuc2lnbmVk IG1hc2s7CiAgICAgICAgICAgICAgYm9vbCByZXN1bHQ7CiAgICAgICAgICAgIH0gdW5tYXA7CiAg ICAgICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgICAgICAgICAgewoKICAg ICAgICAgICAgICB1bnNpZ25lZCBsdGhyZWFkOwogICAgICAgICAgICAgIHVuc2lnbmVkIG9sZF9l c3A7CiAgICAgICAgICAgICAgdW5zaWduZWQgbmV3X2VzcDsKICAgICAgICAgICAgICB1bnNpZ25l ZCBvbGRfZWlwOwogICAgICAgICAgICAgIHVuc2lnbmVkIG5ld19laXA7CiAgICAgICAgICAgIH0g ZXhfcmVnczsKICAgICAgICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQogICAgICAg ICAgICB7CgogICAgICAgICAgICAgIHVuc2lnbmVkIGFkZHI7CiAgICAgICAgICAgICAgdW5zaWdu ZWQgbGVuOwogICAgICAgICAgICAgIHVuc2lnbmVkIHZhbHVlOwogICAgICAgICAgICAgIHVuc2ln bmVkIGNoYXIgbW9kZTsKICAgICAgICAgICAgfSBicDsKICAgICAgICAgIHN0cnVjdCBfX2F0dHJp YnV0ZV9fKChwYWNrZWQpKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgIHVuc2lnbmVkIGVh eCwgZWJwLCBlY3g7CiAgICAgICAgICAgICAgVW5zaWduZWQ2NCBkZXN0OwogICAgICAgICAgICAg IGNoYXIgaXNfaXJxLCBzbmRfbHN0LCBkc3Rfb2ssIGRzdF9sY2s7CiAgICAgICAgICAgIH0gaXBj X3NmbDsKICAgICAgICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQogICAgICAgICAg ICB7CgogICAgICAgICAgICAgIENvbnRleHQgKmRlc3Q7CiAgICAgICAgICAgICAgdW5zaWduZWQg a2VybmVsX2VpcDsKICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICprZXJuZWxfc3A7CiAgICAg ICAgICAgIH0gY3R4X3N3OwogICAgICAgIH0gbTsKICAgICAgY2hhciB0eXBlOwogICAgfSBUYl9l bnRyeTsKCgogIHN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKHJlZ3Bhcm0oMykpKSAoKmluaXRf cG1jKSh1bnNpZ25lZCBldmVudCwgaW50IHVzZXIsIGludCBrZXJuZWwpOwoKICBzdGF0aWMgdm9p ZCBfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpKSkgKCpyZWFkX3BtYykoVGJfZW50cnkgKnRiZSk7 CgogIHN0YXRpYyBMb2dfZXZlbnQgKiBjb25zdCBsb2dfZXZlbnRzW107Cgpwcml2YXRlOgogIHN0 YXRpYyBUYl9lbnRyeSAqdGJ1ZjsKICBzdGF0aWMgVGJfZW50cnkgKnRidWZfYWN0OwogIHN0YXRp YyBsNF90cmFjZWJ1ZmZlcl9zdGF0dXNfdCAqc3RhdHVzOwogIHN0YXRpYyB1bnNpZ25lZCBlbnRy aWVzOwogIHN0YXRpYyB1bnNpZ25lZCBudW1iZXI7CgogIHN0YXRpYyBpbnQgcGVyZl91c2VyOwog IHN0YXRpYyBpbnQgcGVyZl9rZXJuZWw7CiAgc3RhdGljIHVuc2lnbmVkIHBlcmZfZXZlbnQ7Cgog IHN0YXRpYyBjb25zdCBjaGFyICpwZXJmX3R5cGU7CiAgc3RhdGljIGludCBoYXZlX3RzYzsKCnB1 YmxpYzoKCiAgc3RhdGljIHZvaWQgaW5pdCh2b2lkKTsKCiAgc3RhdGljIGludCBnZXRfaGF2ZV90 c2MoKTsKCiAgc3RhdGljIGNvbnN0IGNoYXIqIGdldF9wZXJmX3R5cGUoKTsKCgogIHN0YXRpYyBp bnQgZ2V0X3BlcmZfbW9kZShjb25zdCBjaGFyICoqdHlwZSwgY29uc3QgY2hhciAqKm1vZGUsIHVu c2lnbmVkICpldmVudCwgaW50ICp1c2VyLCBpbnQgKmtlcm5lbCk7CgoKICBzdGF0aWMgdm9pZCBp bml0X3BlcmYodW5zaWduZWQgZXZlbnQsIGludCB1c2VyLCBpbnQga2VybmVsKTsKCgogIHN0YXRp YyB2b2lkIGNsZWFyX3RidWYoKTsKCgogIHN0YXRpYyBqZGJfdGJ1Zjo6VGJfZW50cnkqIG5ld19l bnRyeSgpOwoKCiAgc3RhdGljIHZvaWQgY29tbWl0X2VudHJ5KCk7CgoKICBzdGF0aWMgaW50IGdl dF9lbnRyaWVzKCk7CgoKICBzdGF0aWMgaW50IGdldF90aHJlYWRfZWlwKGludCBlX25yLCBMNF91 aWQgKnRpZCwgdW5zaWduZWQgKmVpcCk7CgogIHN0YXRpYyBpbnQgZ2V0X2V2ZW50KGludCBlX25y LCB1bnNpZ25lZCAqbnVtYmVyLCB1bnNpZ25lZCBsb25nIGxvbmcgKnRzYywgdW5zaWduZWQgbG9u ZyBsb25nICpwbWMpOwoKICBzdGF0aWMgdW5zaWduZWQgZ2V0X3JlZl9ldmVudChpbnQgZV9uciwg Y2hhciAqdHlwZSk7CgogIHN0YXRpYyBpbnQgZ2V0X2RpZmZfdHNjKGludCBlX25yLCB1bnNpZ25l ZCBsb25nIGxvbmcgKmRlbHRhKTsKCiAgc3RhdGljIGludCBnZXRfZGlmZl9wbWMoaW50IGVfbnIs IHVuc2lnbmVkIGxvbmcgbG9uZyAqZGVsdGEpOwoKICBzdGF0aWMgdm9pZCBwcmludF9lbnRyeShp bnQgZV9uciwgY2hhciAqYnVmLCBpbnQgbWF4bGVuKTsKCiAgc3RhdGljIHZvaWQgcHJpbnRfZW50 cnkoVGJfZW50cnkgKmUsIGNoYXIgKmJ1ZiwgaW50IG1heGxlbik7Cgpwcml2YXRlOgogIHN0YXRp YyBpbnQgZXZlbnRfdmFsaWQodW5zaWduZWQgZV9ucik7CgogIHN0YXRpYyBqZGJfdGJ1Zjo6VGJf ZW50cnkqIGxvb2t1cChpbnQgZV9ucik7CgogIHN0YXRpYyB2b2lkIG15X3NucHJpbnRmKGNoYXIg KipidWYsIGludCAqbWF4bGVuLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Cn07CgpjbGFzcyBs b2dfcGF0Y2hfdAp7CnB1YmxpYzoKICBsb2dfcGF0Y2hfdCAqbmV4dDsKCnByaXZhdGU6CiAgdHlw ZWRlZiB1bnNpZ25lZCBjaGFyIGxvZ19wYXRjaF9jb2RlX3RbNV07CiAgbG9nX3BhdGNoX2NvZGVf dCAqb3JpZ19jb2RlOwogIGxvZ19wYXRjaF9jb2RlX3Qgc2F2ZV9jb2RlOwoKcHVibGljOgogIGV4 cGxpY2l0IGxvZ19wYXRjaF90KHZvaWQgKmNvZGUpOwoKICB2b2lkIGVuYWJsZShib29sIGVuYWJs ZSk7CgogIGJvb2wgZW5hYmxlZCh2b2lkKTsKfTsKCmNsYXNzIExvZ19ldmVudAp7CiAgY29uc3Qg Y2hhciAqZXZlbnRfbmFtZTsKICBsb2dfcGF0Y2hfdCAqcGF0Y2g7CiAgaW50IGV2ZW50X3R5cGU7 CgpwdWJsaWM6CiAgZXhwbGljaXQgTG9nX2V2ZW50KGNvbnN0IGNoYXIgKm5hbWUsIGludCB0eXBl LCBpbnQgY291bnQsIGxvZ19wYXRjaF90ICpscCwgLi4uKTsKCgogIHZvaWQgZW5hYmxlKGJvb2wg ZW5hYmxlKTsKCgogIGJvb2wgZW5hYmxlZCh2b2lkKTsKCgogIGNvbnN0IGNoYXIqIGdldF9uYW1l KHZvaWQpOwoKCiAgaW50IGdldF90eXBlKHZvaWQpOwp9OwojIDI5MCAiYXV0by9qZGJfdGJ1Zi5o IgppbmxpbmUgaW50CmpkYl90YnVmOjpnZXRfaGF2ZV90c2MoKQp7CiAgcmV0dXJuIGhhdmVfdHNj Owp9CgoKCmlubGluZSBjb25zdCBjaGFyKgpqZGJfdGJ1Zjo6Z2V0X3BlcmZfdHlwZSgpCnsKICBy ZXR1cm4gcGVyZl90eXBlOwp9CgoKCgppbmxpbmUgaW50CmpkYl90YnVmOjpnZXRfZW50cmllcygp CnsKICByZXR1cm4gZW50cmllczsKfQoKCgoKaW5saW5lIGNvbnN0IGNoYXIqCkxvZ19ldmVudDo6 Z2V0X25hbWUodm9pZCkKewogIHJldHVybiBldmVudF9uYW1lOwp9CgoKCgppbmxpbmUgaW50Ckxv Z19ldmVudDo6Z2V0X3R5cGUodm9pZCkKewogIHJldHVybiBldmVudF90eXBlOwp9CiMgNyAiLi4v c3JjL2tlcm4vaWEzMi9sb2dkZWZzLmgiIDIKIyA1MTkgImF1dG8vdGhyZWFkLmgiIDIKIyA1MzQg ImF1dG8vdGhyZWFkLmgiCmlubGluZSB2b2lkICoKVGhyZWFkOjpvcGVyYXRvciBuZXcoc2l6ZV90 LCB0aHJlYWRpZF90IGlkKQp7CgoKCiAgcmV0dXJuIHN0YXRpY19jYXN0PHZvaWQqPihpZC5sb29r dXAoKSk7Cn0KCgoKCgoKCmlubGluZSBUaHJlYWQqClRocmVhZDo6bG9va3VwKENvbnRleHQqIGMp CnsKICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUaHJlYWQqPihjKTsKfQojIDU2NCAiYXV0by90 aHJlYWQuaCIKaW5saW5lIFNwYWNlX2luZGV4IFRocmVhZDo6c3BhY2VfaW5kZXgoKSBjb25zdAp7 IHJldHVybiBTcGFjZV9pbmRleChpZCgpLnRhc2soKSk7IH0KCgoKCgoKaW5saW5lIFNwYWNlX2lu ZGV4IFRocmVhZDo6Y2hpZWZfaW5kZXgoKSBjb25zdAp7IHJldHVybiBTcGFjZV9pbmRleChpZCgp LmNoaWVmKCkpOyB9CgoKCgoKCgppbmxpbmUgU3BhY2UgKgpUaHJlYWQ6OnNwYWNlKCkgY29uc3QK ewogIHJldHVybiBfc3BhY2U7Cn0KIyA1OTQgImF1dG8vdGhyZWFkLmgiCmlubGluZSBUaHJlYWRf bG9jayAqClRocmVhZDo6dGhyZWFkX2xvY2soKQp7CiAgcmV0dXJuICZfdGhyZWFkX2xvY2s7Cn0K CgoKCgoKaW5saW5lIHVuc2lnbmVkIFRocmVhZDo6bmVzdCgpIGNvbnN0CnsgcmV0dXJuIGlkKCku bmVzdCgpOyB9CiMgNjIxICJhdXRvL3RocmVhZC5oIgppbmxpbmUgdm9pZApUaHJlYWQ6OnNldHVw X2lwY193aW5kb3codW5zaWduZWQgd2luLCB2bV9vZmZzZXRfdCBhZGRyZXNzKQp7CiAgaWYgKHdp biA9PSAwKQogICAgewogICAgICBpZiAoX3ZtX3dpbmRvdzAgIT0gYWRkcmVzcykKICAgICAgICB7 CiAgICAgICAgICBfdm1fd2luZG93MCA9IGFkZHJlc3M7CiAgICAgICAgICBrbWVtOjp0bGJfZmx1 c2goKTsKICAgICAgICB9CiAgICB9CiAgZWxzZQogICAgewogICAgICBpZiAoX3ZtX3dpbmRvdzEg IT0gYWRkcmVzcykKICAgICAgICB7CiAgICAgICAgICBfdm1fd2luZG93MSA9IGFkZHJlc3M7CiAg ICAgICAgICBrbWVtOjp0bGJfZmx1c2goKTsKICAgICAgICB9CiAgICB9Cn0KCgoKCgoKaW5saW5l IGJvb2wKVGhyZWFkOjppbl9wcmVzZW50X2xpc3QoKQp7CiAgcmV0dXJuIHByZXNlbnRfbmV4dDsK fQoKCgoKCgoKaW5saW5lIHZvaWQKVGhyZWFkOjpwcmVzZW50X2VucXVldWUoVGhyZWFkICpzaWJs aW5nKQp7CiAgTG9ja19ndWFyZDxDcHVfbG9jaz4gZ3VhcmQgKCZjcHVfbG9jayk7CgogIGlmICgh IGluX3ByZXNlbnRfbGlzdCgpKQogICAgewogICAgICBwcmVzZW50X25leHQgPSBzaWJsaW5nLT5w cmVzZW50X25leHQ7CiAgICAgIHByZXNlbnRfcHJldiA9IHNpYmxpbmc7CiAgICAgIHNpYmxpbmct PnByZXNlbnRfbmV4dCA9IHRoaXM7CiAgICAgIHByZXNlbnRfbmV4dC0+cHJlc2VudF9wcmV2ID0g dGhpczsKICAgIH0KfQoKCgoKCgppbmxpbmUgdm9pZApUaHJlYWQ6OnByZXNlbnRfZGVxdWV1ZSgp CnsKICBMb2NrX2d1YXJkPENwdV9sb2NrPiBndWFyZCAoJmNwdV9sb2NrKTsKCiAgaWYgKGluX3By ZXNlbnRfbGlzdCgpKQogICAgewogICAgICBwcmVzZW50X3ByZXYtPnByZXNlbnRfbmV4dCA9IHBy ZXNlbnRfbmV4dDsKICAgICAgcHJlc2VudF9uZXh0LT5wcmVzZW50X3ByZXYgPSBwcmVzZW50X3By ZXY7CiAgICAgIHByZXNlbnRfbmV4dCA9IDA7CiAgICB9Cn0KCgoKCgoKaW5saW5lIFRocmVhZCoK Y3VycmVudF90aHJlYWQoKQp7CiAgcmV0dXJuIFRocmVhZDo6bG9va3VwKGN1cnJlbnQgKCkpOwp9 CgoKCmlubGluZSB2b2lkIHRocmVhZF90aW1lcl9pbnRlcnJ1cHRfYXJjaCh2b2lkKQp7CgoKCiAg aWYgKENvbmZpZzo6c2NoZWR1bGluZ191c2luZ19waXQpCiAgICAgIGRvIHsgYXNtIHZvbGF0aWxl ICgiLmdsb2JsICAiImxvZ190aW1lcl9pcnEiIgkJCVxuXHQiICIuZ2xvYmwgIHBhdGNoXyIibG9n X3RpbWVyX2lycSIiCQlcblx0IiAicGF0Y2hfIiJsb2dfdGltZXJfaXJxIiI6CQkJXG5cdCIgImpt cCAgICAgIiJsb2dfdGltZXJfaXJxIiIJCQlcblx0IiAiMToJCQkJCVxuXHQiICIudGV4dCAgIDEJ CQkJXG5cdCIgIiIibG9nX3RpbWVyX2lycSIiOgkJCQlcblx0Iik7IHsgdW5zaWduZWQgZWJwOyBh c20gdm9sYXRpbGUgKCJtb3ZsICUlZWJwLCAlMCIgOiAiPWciKGVicCkpOyB7IGpkYl90YnVmOjpU Yl9lbnRyeSAqdGJlID0gamRiX3RidWY6Om5ld19lbnRyeSgpOyB0YmUtPnR5cGUgPSAyOyB0YmUt PmN1cnJlbnQgPSBjdXJyZW50KCk7IHRiZS0+ZWlwID0gdGJlLT5jdXJyZW50LT5yZWdzKCktPmVp cDsgdGJlLT5tLmlwYy5lYXggPSB0YmUtPm0uaXBjLmVicCA9IDA7IHRiZS0+bS5pcGMuZGVzdCA9 IDAgKyAxOyBqZGJfdGJ1Zjo6Y29tbWl0X2VudHJ5KCk7IH0gYXNtIHZvbGF0aWxlICgibW92bCAl MCwgJSVlYnAiIDogOiAiZyIoZWJwKSk7IH0gYXNtIHZvbGF0aWxlICgiam1wICAgICAxYgkJCQlc blx0IiAiLnByZXZpb3VzCQkJCVxuXHQiIDogOiA6ICJlYXgiLCJlYngiLCJlY3giLCJlZHgiLCJl c2kiLCAiZWRpIiwibWVtb3J5Iik7IH0gd2hpbGUgKDApOwogIGVsc2UKICAgICAgZG8geyBhc20g dm9sYXRpbGUgKCIuZ2xvYmwgICIibG9nX3RpbWVyX2lycSIiCQkJXG5cdCIgIi5nbG9ibCAgcGF0 Y2hfIiJsb2dfdGltZXJfaXJxIiIJCVxuXHQiICJwYXRjaF8iImxvZ190aW1lcl9pcnEiIjoJCQlc blx0IiAiam1wICAgICAiImxvZ190aW1lcl9pcnEiIgkJCVxuXHQiICIxOgkJCQkJXG5cdCIgIi50 ZXh0ICAgMQkJCQlcblx0IiAiIiJsb2dfdGltZXJfaXJxIiI6CQkJCVxuXHQiKTsgeyB1bnNpZ25l ZCBlYnA7IGFzbSB2b2xhdGlsZSAoIm1vdmwgJSVlYnAsICUwIiA6ICI9ZyIoZWJwKSk7IHsgamRi X3RidWY6OlRiX2VudHJ5ICp0YmUgPSBqZGJfdGJ1Zjo6bmV3X2VudHJ5KCk7IHRiZS0+dHlwZSA9 IDI7IHRiZS0+Y3VycmVudCA9IGN1cnJlbnQoKTsgdGJlLT5laXAgPSB0YmUtPmN1cnJlbnQtPnJl Z3MoKS0+ZWlwOyB0YmUtPm0uaXBjLmVheCA9IHRiZS0+bS5pcGMuZWJwID0gMDsgdGJlLT5tLmlw Yy5kZXN0ID0gOCArIDE7IGpkYl90YnVmOjpjb21taXRfZW50cnkoKTsgfSBhc20gdm9sYXRpbGUg KCJtb3ZsICUwLCAlJWVicCIgOiA6ICJnIihlYnApKTsgfSBhc20gdm9sYXRpbGUgKCJqbXAgICAg IDFiCQkJCVxuXHQiICIucHJldmlvdXMJCQkJXG5cdCIgOiA6IDogImVheCIsImVieCIsImVjeCIs ImVkeCIsImVzaSIsICJlZGkiLCJtZW1vcnkiKTsgfSB3aGlsZSAoMCk7CgogIFRpbWVyOjphY2tu b3dsZWRnZSgpOwoKCgoKfQojIDQgImF1dG8vdGhyZWFkLWxvZy5jYyIgMgojIDEgImF1dG8vdGhy ZWFkX2kuaCIgMQoKCgoKCgojIDEgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9jc3RkbGli IiAxCgoKCgoKIyAxICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1ZGUvc3RkbGliLmgiIDEKCgoK CiMgMSAiL3Vzci9saWIvZ2NjLXNuYXBzaG90L2xpYi9nY2MtbGliL2kzODYtbGludXgvMy4zL2lu Y2x1ZGUvc3RkZGVmLmgiIDEKIyA2ICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1ZGUvc3RkbGli LmgiIDIKCmV4dGVybiAiQyIgewoKaW50IGF0ZXhpdCh2b2lkICgqZnVuY3Rpb24pKHZvaWQpKTsK CmRvdWJsZSBzdHJ0b2QoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0cik7CmxvbmcgaW50 IHN0cnRvbChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSk7CnVuc2ln bmVkIGxvbmcgaW50IHN0cnRvdWwoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50 IGJhc2UpOwoKZXh0ZXJuIGludCBfX2x0b3N0cihjaGFyICpzLCB1bnNpZ25lZCBpbnQgc2l6ZSwg dW5zaWduZWQgbG9uZyBpLCB1bnNpZ25lZCBpbnQgYmFzZSwgaW50IFVwQ2FzZSk7CmV4dGVybiBp bnQgX19kdG9zdHIoZG91YmxlIGQsY2hhciAqYnVmLHVuc2lnbmVkIGludCBtYXhsZW4sdW5zaWdu ZWQgaW50IHByZWMpOwoKCl9fZXh0ZW5zaW9uX18gbG9uZyBsb25nIGludCBzdHJ0b2xsKGNvbnN0 IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKTsKX19leHRlbnNpb25fXyB1bnNp Z25lZCBsb25nIGxvbmcgaW50IHN0cnRvdWxsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRw dHIsIGludCBiYXNlKTsKX19leHRlbnNpb25fXyBpbnQgX19sbHRvc3RyKGNoYXIgKnMsIHVuc2ln bmVkIGludCBzaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgaSwgdW5zaWduZWQgaW50IGJhc2UsIGlu dCBVcENhc2UpOwoKCmludCBhdG9pKGNvbnN0IGNoYXIgKm5wdHIpOwpsb25nIGludCBhdG9sKGNv bnN0IGNoYXIgKm5wdHIpOwpkb3VibGUgYXRvZihjb25zdCBjaGFyICpucHRyKTsKCgoKCnZvaWQg ZXhpdChpbnQgc3RhdHVzKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwp2b2lkIGFib3J0KHZv aWQpOwoKCgoKdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgcXVvdCxyZW07IH0gZGl2X3Q7CmRpdl90IGRp dihpbnQgbnVtZXIsIGludCBkZW5vbSkgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKCnR5cGVkZWYg c3RydWN0IHsgbG9uZyBpbnQgcXVvdCxyZW07IH0gbGRpdl90OwpsZGl2X3QgbGRpdihsb25nIGlu dCBudW1lciwgbG9uZyBpbnQgZGVub20pIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Cgp0eXBlZGVm IHN0cnVjdCB7IGxvbmcgbG9uZyBpbnQgcXVvdCxyZW07IH0gbGxkaXZfdDsKbGxkaXZfdCBsbGRp dihsb25nIGxvbmcgaW50IG51bWVyLCBsb25nIGxvbmcgaW50IGRlbm9tKSBfX2F0dHJpYnV0ZV9f KChjb25zdCkpOwoKaW50IGFicyhpbnQgaSkgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKbG9uZyBp bnQgbGFicyhsb25nIGludCBpKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwpfX2V4dGVuc2lvbl9f IGxvbmcgbG9uZyBpbnQgbGxhYnMobG9uZyBsb25nIGludCBpKSBfX2F0dHJpYnV0ZV9fKChjb25z dCkpOwoKfQojIDcgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9jc3RkbGliIiAyCgoKbmFt ZXNwYWNlIHN0ZCB7CgoKCiAgdXNpbmcgOjphdGV4aXQ7CiAgdXNpbmcgOjphYnM7CiAgdXNpbmcg OjpsYWJzOwogIHVzaW5nIDo6ZGl2X3Q7CiAgdXNpbmcgOjpsZGl2X3Q7CiAgdXNpbmcgOjpsbGRp dl90OwogIHVzaW5nIDo6ZGl2OwogIHVzaW5nIDo6bGRpdjsKICB1c2luZyA6OmxsZGl2OwogIHVz aW5nIDo6ZXhpdDsKICB1c2luZyA6OmFib3J0OwogIHVzaW5nIDo6YXRvaTsKICB1c2luZyA6OmF0 b2w7CiAgdXNpbmcgOjphdG9mOwogIHVzaW5nIDo6c3RydG91bDsKICB1c2luZyA6OnN0cnRvbDsK ICB1c2luZyA6OnN0cnRvZDsKCgoKICBpbmxpbmUgbG9uZwogIGFicyhsb25nIGkpIHsgcmV0dXJu IGxhYnMoaSk7IH0KCiAgaW5saW5lIGxvbmcgbG9uZwogIGFicyhsb25nIGxvbmcgaSkgeyByZXR1 cm4gbGxhYnMoaSk7IH0KCiAgaW5saW5lIGxkaXZfdAogIGRpdiggbG9uZyBpLCBsb25nIGogKSB7 IHJldHVybiBsZGl2KGksaik7IH0KCiAgaW5saW5lIGxsZGl2X3QKICBkaXYoIGxvbmcgbG9uZyBp LCBsb25nIGxvbmcgaiApIHsgcmV0dXJuIGxsZGl2KGksaik7IH0KCn07CiMgOCAiYXV0by90aHJl YWRfaS5oIiAyCgoKCiMgMSAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvc2VnLmgi IDEKIyA0NCAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvc2VnLmgiCnN0cnVjdCB4 ODZfZGVzYyB7CiAgICAgICAgdW5zaWduZWQgaW50IGxpbWl0X2xvdzoxNiwKICAgICAgICAgICAg ICAgICAgICAgICAgYmFzZV9sb3c6MTYsCiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfbWVk OjgsCiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzczo4LAogICAgICAgICAgICAgICAgICAg ICAgICBsaW1pdF9oaWdoOjQsCiAgICAgICAgICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5OjQs CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfaGlnaDo4Owp9OwoKCgoKc3RydWN0IHg4Nl9n YXRlIHsKICAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0X2xvdzoxNiwKICAgICAgICAgICAgICAg ICAgICAgICAgc2VsZWN0b3I6MTYsCiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfY291bnQ6 OCwKICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzOjgsCiAgICAgICAgICAgICAgICAgICAg ICAgIG9mZnNldF9oaWdoOjE2Owp9OwojIDEyNyAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1 eC94ODYvc2VnLmgiCnN0cnVjdCBwc2V1ZG9fZGVzY3JpcHRvcgp7CiAgICAgICAgc2hvcnQgcGFk OwogICAgICAgIHVuc2lnbmVkIHNob3J0IGxpbWl0OwogICAgICAgIHVuc2lnbmVkIGxvbmcgbGlu ZWFyX2Jhc2U7Cn07CgoKCmV4dGVybiBfX2lubGluZSB2b2lkCmZpbGxfZGVzY3JpcHRvcihzdHJ1 Y3QgeDg2X2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGJhc2UsIHVuc2lnbmVkIGxpbWl0LAogICAgICAg ICAgICAgICAgdW5zaWduZWQgY2hhciBhY2Nlc3MsIHVuc2lnbmVkIGNoYXIgc2l6ZWJpdHMpCnsK ICAgICAgICBpZiAobGltaXQgPiAweGZmZmZmKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGxp bWl0ID4+PSAxMjsKICAgICAgICAgICAgICAgIHNpemViaXRzIHw9IDB4ODsKICAgICAgICB9CiAg ICAgICAgZGVzYy0+bGltaXRfbG93ID0gbGltaXQgJiAweGZmZmY7CiAgICAgICAgZGVzYy0+YmFz ZV9sb3cgPSBiYXNlICYgMHhmZmZmOwogICAgICAgIGRlc2MtPmJhc2VfbWVkID0gKGJhc2UgPj4g MTYpICYgMHhmZjsKICAgICAgICBkZXNjLT5hY2Nlc3MgPSBhY2Nlc3MgfCAweDgwOwogICAgICAg IGRlc2MtPmxpbWl0X2hpZ2ggPSBsaW1pdCA+PiAxNjsKICAgICAgICBkZXNjLT5ncmFudWxhcml0 eSA9IHNpemViaXRzOwogICAgICAgIGRlc2MtPmJhc2VfaGlnaCA9IGJhc2UgPj4gMjQ7Cn0KCgpl eHRlcm4gX19pbmxpbmUgdm9pZApmaWxsX2Rlc2NyaXB0b3JfYmFzZShzdHJ1Y3QgeDg2X2Rlc2Mg KmRlc2MsIHVuc2lnbmVkIGJhc2UpCnsKICAgICAgICBkZXNjLT5iYXNlX2xvdyA9IGJhc2UgJiAw eGZmZmY7CiAgICAgICAgZGVzYy0+YmFzZV9tZWQgPSAoYmFzZSA+PiAxNikgJiAweGZmOwogICAg ICAgIGRlc2MtPmJhc2VfaGlnaCA9IGJhc2UgPj4gMjQ7Cn0KCgpleHRlcm4gX19pbmxpbmUgdm9p ZApmaWxsX2Rlc2NyaXB0b3JfbGltaXQoc3RydWN0IHg4Nl9kZXNjICpkZXNjLCB1bnNpZ25lZCBs aW1pdCkKewogICAgICAgIGlmIChsaW1pdCA+IDB4ZmZmZmYpCiAgICAgICAgewogICAgICAgICAg ICAgICAgbGltaXQgPj49IDEyOwogICAgICAgICAgICAgICAgZGVzYy0+Z3JhbnVsYXJpdHkgfD0g MHg4OwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBkZXNjLT5ncmFudWxh cml0eSAmPSB+MHg4OwogICAgICAgIGRlc2MtPmxpbWl0X2xvdyA9IGxpbWl0ICYgMHhmZmZmOwog ICAgICAgIGRlc2MtPmxpbWl0X2hpZ2ggPSBsaW1pdCA+PiAxNjsKfQoKCmV4dGVybiBfX2lubGlu ZSB2b2lkCmZpbGxfZ2F0ZShzdHJ1Y3QgeDg2X2dhdGUgKmdhdGUsIHVuc2lnbmVkIG9mZnNldCwg dW5zaWduZWQgc2hvcnQgc2VsZWN0b3IsCiAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFjY2Vzcywg dW5zaWduZWQgY2hhciB3b3JkX2NvdW50KQp7CiAgICAgICAgZ2F0ZS0+b2Zmc2V0X2xvdyA9IG9m ZnNldCAmIDB4ZmZmZjsKICAgICAgICBnYXRlLT5zZWxlY3RvciA9IHNlbGVjdG9yOwogICAgICAg IGdhdGUtPndvcmRfY291bnQgPSB3b3JkX2NvdW50OwogICAgICAgIGdhdGUtPmFjY2VzcyA9IGFj Y2VzcyB8IDB4ODA7CiAgICAgICAgZ2F0ZS0+b2Zmc2V0X2hpZ2ggPSAob2Zmc2V0ID4+IDE2KSAm IDB4ZmZmZjsKfQojIDEyICJhdXRvL3RocmVhZF9pLmgiIDIKIyAxICIuLi9zcmMvbGliL2tlcm4v aW5jbHVkZS9mbHV4L3g4Ni9iYXNlX3RyYXAuaCIgMQojIDQzICIuLi9zcmMvbGliL2tlcm4vaW5j bHVkZS9mbHV4L3g4Ni9iYXNlX3RyYXAuaCIKc3RydWN0IHRyYXBfc3RhdGUKewoKICAgICAgICB1 bnNpZ25lZCBpbnQgZ3M7CiAgICAgICAgdW5zaWduZWQgaW50IGZzOwogICAgICAgIHVuc2lnbmVk IGludCBlczsKICAgICAgICB1bnNpZ25lZCBpbnQgZHM7CgoKICAgICAgICB1bnNpZ25lZCBpbnQg ZWRpOwogICAgICAgIHVuc2lnbmVkIGludCBlc2k7CiAgICAgICAgdW5zaWduZWQgaW50IGVicDsK ICAgICAgICB1bnNpZ25lZCBpbnQgY3IyOwogICAgICAgIHVuc2lnbmVkIGludCBlYng7CiAgICAg ICAgdW5zaWduZWQgaW50IGVkeDsKICAgICAgICB1bnNpZ25lZCBpbnQgZWN4OwogICAgICAgIHVu c2lnbmVkIGludCBlYXg7CgoKICAgICAgICB1bnNpZ25lZCBpbnQgdHJhcG5vOwoKCiAgICAgICAg dW5zaWduZWQgaW50IGVycjsKCgogICAgICAgIHVuc2lnbmVkIGludCBlaXA7CiAgICAgICAgdW5z aWduZWQgaW50IGNzOwogICAgICAgIHVuc2lnbmVkIGludCBlZmxhZ3M7CiAgICAgICAgdW5zaWdu ZWQgaW50IGVzcDsKICAgICAgICB1bnNpZ25lZCBpbnQgc3M7CgoKICAgICAgICB1bnNpZ25lZCBp bnQgdjg2X2VzOwogICAgICAgIHVuc2lnbmVkIGludCB2ODZfZHM7CiAgICAgICAgdW5zaWduZWQg aW50IHY4Nl9mczsKICAgICAgICB1bnNpZ25lZCBpbnQgdjg2X2dzOwp9OwojIDkwICIuLi9zcmMv bGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9iYXNlX3RyYXAuaCIKZXh0ZXJuICJDIiB7CgoKCgoK CmV4dGVybiB2b2lkIGJhc2VfdHJhcF9pbml0KHZvaWQpOwoKCgoKCgoKZXh0ZXJuIHN0cnVjdCBn YXRlX2luaXRfZW50cnkgYmFzZV90cmFwX2luaXR0YWJbXTsKIyAxMTcgIi4uL3NyYy9saWIva2Vy bi9pbmNsdWRlL2ZsdXgveDg2L2Jhc2VfdHJhcC5oIgpleHRlcm4gaW50ICgqYmFzZV90cmFwX2hh bmRsZXIpKHN0cnVjdCB0cmFwX3N0YXRlICpzdGF0ZSk7CiMgMTI4ICIuLi9zcmMvbGliL2tlcm4v aW5jbHVkZS9mbHV4L3g4Ni9iYXNlX3RyYXAuaCIKdm9pZCB0cmFwX2R1bXAoY29uc3Qgc3RydWN0 IHRyYXBfc3RhdGUgKnN0KTsKIyAxMzcgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2 L2Jhc2VfdHJhcC5oIgp2b2lkIHRyYXBfZHVtcF9wYW5pYyhjb25zdCBzdHJ1Y3QgdHJhcF9zdGF0 ZSAqc3QpOwp9CiMgMTMgImF1dG8vdGhyZWFkX2kuaCIgMgoKCgoKIyAxICJhdXRvL3NwYWNlX2lu ZGV4X3V0aWwuaCIgMQojIDEzICJhdXRvL3NwYWNlX2luZGV4X3V0aWwuaCIKY2xhc3MgU3BhY2Vf aW5kZXhfdXRpbAp7CgpwdWJsaWM6CiAgc3RhdGljIFNwYWNlX2luZGV4IGNoaWVmKFNwYWNlX2lu ZGV4IHRhc2spOwp9OwojIDM2ICJhdXRvL3NwYWNlX2luZGV4X3V0aWwuaCIKaW5saW5lIFNwYWNl X2luZGV4ClNwYWNlX2luZGV4X3V0aWw6OmNoaWVmKFNwYWNlX2luZGV4IHRhc2spCnsKICBMb2Nr X2d1YXJkPENwdV9sb2NrPiBndWFyZCAoJmNwdV9sb2NrKTsKCiAgU3BhY2UqIHMgPSB0YXNrLmxv b2t1cCgpOwoKICBpZiAocykKICAgIHJldHVybiBzLT5jaGllZigpOwoKICByZXR1cm4gdGFzay5j aGllZigpOwp9CiMgMTggImF1dG8vdGhyZWFkX2kuaCIgMgojIDEgImF1dG8vaXJxLmgiIDEKIyAx MyAiYXV0by9pcnEuaCIKY2xhc3MgUmVjZWl2ZXI7CgoKCgoKY2xhc3MgaXJxX3QgOiBwdWJsaWMg U2VuZGVyCnsKcHVibGljOgogIHZpcnR1YWwgYm9vbCBhbGxvYyhSZWNlaXZlciAqdCwgYm9vbCBh Y2tfaW5fa2VybmVsKSA9IDA7CiAgdmlydHVhbCBib29sIGZyZWUoUmVjZWl2ZXIgKnQpID0gMDsK ICB2aXJ0dWFsIFJlY2VpdmVyICpvd25lcigpIGNvbnN0ID0gMDsKCnByaXZhdGU6CiAgaXJxX3Qo KTsKICBpcnFfdChpcnFfdCYpOwoKICBjbGFzcyBJcnFfcCB7CiAgcHVibGljOgogICAgSXJxX3Ao IGlycV90ICpfcCA9IDAgKSA6IHAoX3ApIHt9CiAgICBJcnFfcCAmb3BlcmF0b3IgPSAoaXJxX3Qg Kl9wKSB7IHAgPSBfcDsgcmV0dXJuICp0aGlzOyB9CiAgICBvcGVyYXRvciBpcnFfdCooKSB7IHJl dHVybiBwOyB9CiAgcHJpdmF0ZToKICAgIGlycV90ICpwOwogIH07CgogIHN0YXRpYyBpcnFfdCAq aXJxc1tdOwoKcHVibGljOgoKICBzdGF0aWMgaXJxX3QgKmxvb2t1cCggdW5zaWduZWQgaXJxICk7 CiAgc3RhdGljIHZvaWQgcmVnaXN0ZXJfaXJxKCB1bnNpZ25lZCBpcnEsIGlycV90ICppICk7Cgpw cm90ZWN0ZWQ6CiAgUmVjZWl2ZXIgKl9pcnFfdGhyZWFkOwogIGludCBfcXVldWVkOwogIGJvb2wg X2Fja19pbl9rZXJuZWw7CgpwdWJsaWM6CiAgc3RhdGljIHZvaWQgaW5pdCgpOwoKCgoKICBleHBs aWNpdCBpcnFfdCh1bnNpZ25lZCBpcnFudW0pOwoKICB2aXJ0dWFsIHZvaWQgaXBjX3JlY2VpdmVy X3JlYWR5KCk7CgoKCgoKICB2b2lkIG1heWJlX2Fja25vd2xlZGdlKCk7CgoKICB2b2lkIG1heWJl X2VuYWJsZSgpOwoKcHJpdmF0ZToKCgoKICBpbnQgY29uc3VtZSgpOwp9OwoKZXh0ZXJuIHVuc2ln bmVkIHBpY19tYXNrX21hc3RlcjsKZXh0ZXJuIHVuc2lnbmVkIHBpY19tYXNrX3NsYXZlOwoKZXh0 ZXJuICJDIiB2b2lkIGZhc3RfcmV0X2Zyb21faXJxKHZvaWQpOwoKdm9pZCBzZXRfdGltZXJfdmVj dG9yX3J1bih2b2lkKTsKCnZvaWQgc2V0X3RpbWVyX3ZlY3Rvcl9zdG9wKHZvaWQpOwojIDEwOCAi YXV0by9pcnEuaCIKaW5saW5lIHZvaWQgaXJxX3Q6Om1heWJlX2Fja25vd2xlZGdlKCkKewogIGlm IChfYWNrX2luX2tlcm5lbCkKICAgIHsKICAgICAgdW5zaWduZWQgaXJxbnVtID0gaWQoKS5pcnEo KTsKCiAgICAgIFBpYzo6ZGlzYWJsZV9sb2NrZWQoaXJxbnVtKTsKICAgICAgUGljOjphY2tub3ds ZWRnZV9sb2NrZWQoaXJxbnVtKTsKICAgIH0KfQoKCgoKaW5saW5lIHZvaWQgaXJxX3Q6Om1heWJl X2VuYWJsZSgpCnsKICBpZiAoX2Fja19pbl9rZXJuZWwpCiAgICB7CiAgICAgIHVuc2lnbmVkIGly cW51bSA9IGlkKCkuaXJxKCk7CiAgICAgIFBpYzo6ZW5hYmxlKGlycW51bSk7CiAgICB9Cn0KCgoK aW5saW5lIGlycV90ICppcnFfdDo6bG9va3VwKCB1bnNpZ25lZCBpcnEgKQp7CiAgaWYoaXJxIDwg Q29uZmlnOjpNQVhfTlVNX0lSUSkKICAgIHJldHVybiBpcnFzW2lycV07CiAgZWxzZQogICAgcmV0 dXJuIDA7Cn0KCgoKaW5saW5lIHZvaWQgaXJxX3Q6OnJlZ2lzdGVyX2lycSggdW5zaWduZWQgaXJx LCBpcnFfdCAqaSApCnsKICBpZihpcnEgPCBDb25maWc6Ok1BWF9OVU1fSVJRKSB7CiAgICBpcnFz W2lycV0gPSBpOwogIH0KfQojIDE5ICJhdXRvL3RocmVhZF9pLmgiIDIKCgoKCiMgMSAiYXV0by9r bWVtX2FsbG9jLmgiIDEKIyAxOSAiYXV0by9rbWVtX2FsbG9jLmgiCmNsYXNzIGttZW1fYWxsb2Mg OiBrbWVtCnsKCnByaXZhdGU6CiAgZnJpZW5kIGNsYXNzIGpkYjsKCnB1YmxpYzoKCiAgZW51bSB6 ZXJvX2ZpbGxfdCB7IG5vX3plcm9fZmlsbCA9IDAsIHplcm9fZmlsbCwgemVyb19tYXAgfTsKCiAg c3RhdGljIHZvaWQgKiBwYWdlX2FsbG9jICh2b2lkKTsKICBzdGF0aWMgdm9pZCAqIHBhZ2VfYWxs b2MgKHZtX29mZnNldF90IHZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJv X2ZpbGxfdCBkb196ZXJvX2ZpbGwgPSBub196ZXJvX2ZpbGwsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGJvb2wgdXNlcl9hY2Nlc3NpYmxlID0gZmFsc2UpOwogIHN0YXRpYyB2b2lk IHBhZ2VfZnJlZSAodm9pZCAqcGFnZSk7CgpwdWJsaWM6CgoKCgogIHN0YXRpYyB2b2lkICphbGxv Yyh2bV9zaXplX3Qgc2l6ZSk7CgoKCgoKCiAgc3RhdGljIHZvaWQgZnJlZSh2b2lkICpibG9jaywg dm1fc2l6ZV90IHNpemUpOwoKICBzdGF0aWMgdm9pZCBkZWJ1Z19kdW1wKCk7Cgpwcml2YXRlOgoK ICBzdGF0aWMgdm9pZCBwYWdlX2ZyZWVfcGh5cyh2b2lkICpwYWdlKTsKfTsKCgoKCgoKCiMgMSAi YXV0by9rZGJfa2UuaCIgMQojIDIyICJhdXRvL2tkYl9rZS5oIgpib29sIGtkYl9rZShjb25zdCBj aGFyICptc2cpOwojIDM4ICJhdXRvL2tkYl9rZS5oIgppbmxpbmUgYm9vbCBrZGJfa2UoY29uc3Qg Y2hhciAqbXNnKQp7CiAgcHJpbnRmKCJLREI6ICVzXG4iLG1zZyk7CgogIGFzbSAoImludDMgICAg ICAgICAgICBcblx0IgogICAgICAgImptcCAxZgkJXG5cdCIKICAgICAgICIuYXNjaWkgXCJLREJc Iglcblx0IgogICAgICAgIjE6CQlcblx0Iik7CgogIHJldHVybiB0cnVlOwp9CiMgNjMgImF1dG8v a21lbV9hbGxvYy5oIiAyCiMgMSAiYXV0by9wbWVtX2FsbG9jLmgiIDEKIyAxMyAiYXV0by9wbWVt X2FsbG9jLmgiCmNsYXNzIFBtZW1fYWxsb2MKewpwdWJsaWM6CgogIHN0YXRpYyB2b2lkIGluaXQo KTsKIyAzMSAiYXV0by9wbWVtX2FsbG9jLmgiCiAgc3RhdGljIFBfcHRyPHZvaWQ+IHBhZ2VfYWxs b2MoIGludCBvcmRlciA9IDAgKTsKIyA0MiAiYXV0by9wbWVtX2FsbG9jLmgiCiAgc3RhdGljIHZv aWQgcGFnZV9mcmVlKCBQX3B0cjx2b2lkPiBwYWdlLCBpbnQgb3JkZXIgPSAwICk7CiMgNTMgImF1 dG8vcG1lbV9hbGxvYy5oIgogIHN0YXRpYyBQX3B0cjx2b2lkPiB1bmFsaWduZWRfcGFnZV9hbGxv YyggaW50IHBhZ2VzID0gMSApOwojIDY0ICJhdXRvL3BtZW1fYWxsb2MuaCIKICBzdGF0aWMgdm9p ZCB1bmFsaWduZWRfcGFnZV9mcmVlKCBQX3B0cjx2b2lkPiBwYWdlLCBpbnQgcGFnZXMgPSAxICk7 CgoKcHVibGljOgogIHN0YXRpYyB2b2lkIGRlYnVnX2R1bXAoKTsKfTsKIyA4MyAiYXV0by9wbWVt X2FsbG9jLmgiCmlubGluZSB2b2lkIFBtZW1fYWxsb2M6OnBhZ2VfZnJlZSggUF9wdHI8dm9pZD4g cGFnZSwgaW50IG9yZGVyICkKewogIHVuYWxpZ25lZF9wYWdlX2ZyZWUocGFnZSwxPDxvcmRlcik7 Cn0KIyA2NCAiYXV0by9rbWVtX2FsbG9jLmgiIDIKCiMgMSAiYXV0by92bWVtX2FsbG9jLmgiIDEK CgoKCgojIDEgImF1dG8vcGFnaW5nLmgiIDEKIyAxMyAiYXV0by9wYWdpbmcuaCIKbmFtZXNwYWNl IFBhZ2UgewojIDM0ICJhdXRvL3BhZ2luZy5oIgp9OwoKbmFtZXNwYWNlIFBhZ2UgewoKICB0eXBl ZGVmIFVuc2lnbmVkMzIgQXR0cmliczsKCiAgZW51bSBBdHRyaWJzX2VudW0gewoKICAgIFVTRVJf Tk8gPSAweDA2LAogICAgVVNFUl9STyA9IDB4MDAsCiAgICBVU0VSX1JXID0gMHgwMiwKICAgIFVT RVJfUlggPSAweDAwLAogICAgVVNFUl9YTyA9IDB4MDAsCiAgICBVU0VSX1JXWCA9IDB4MDIsCgog ICAgUk8gPSAweDAwLAogICAgS0VSTiA9IDB4MDQsCiAgICBVU0VSID0gMHgwMCwKCiAgICBDUFVf R0xPQkFMID0gMHgxMDAsCgogICAgTk9OQ0FDSEVBQkxFID0gMHgxMCwKICAgIENBQ0hFQUJMRSA9 IDB4MDAsCgogICAgV1JJVEVfVEhST1VHSCA9IDB4MDgsCgogICAgTUFYX0FUVFJJQlMgPSAweDEx ZQogIH07Cgp9OwojIDcgImF1dG8vdm1lbV9hbGxvYy5oIiAyCiMgMTUgImF1dG8vdm1lbV9hbGxv Yy5oIgpjbGFzcyBWbWVtX2FsbG9jCnsKcHVibGljOgoKICBlbnVtIFplcm9fZmlsbCB7CiAgICBO T19aRVJPX0ZJTEwgPSAwLAogICAgWkVST19GSUxMLAogICAgWkVST19NQVAKICB9OwoKICBzdGF0 aWMgdm9pZCBpbml0KCk7CgogIHN0YXRpYyB2b2lkICpwYWdlX2FsbG9jKCB2b2lkICphZGRyZXNz LCBpbnQgb3JkZXIgPSAwLCBaZXJvX2ZpbGwgemYgPSBOT19aRVJPX0ZJTEwsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIFBhZ2U6OkF0dHJpYnMgcGEgPSBQYWdlOjpVU0VSX05PICk7CgogIHN0 YXRpYyB2b2lkIHBhZ2VfZnJlZSggdm9pZCAqcGFnZSwgaW50IG9yZGVyID0gMCApOwoKICBzdGF0 aWMgdm9pZCBwYWdlX21hcCAodm9pZCAqYWRkcmVzcywgaW50IG9yZGVyLCBaZXJvX2ZpbGwgemYs CiAgICAgICAgICAgICAgICAgICAgICAgIHZtX29mZnNldF90IHBoeXMpOwoKICBzdGF0aWMgdm9p ZCBwYWdlX3VubWFwICh2b2lkICphZGRyZXNzLCBpbnQgb3JkZXIpOwpwcml2YXRlOgoKcHJpdmF0 ZToKICB0ZW1wbGF0ZTwgdHlwZW5hbWUgX1R5ID4KICBzdGF0aWMgX1R5ICpwaHlzX3RvX3ZpcnQo IFBfcHRyPF9UeT4gKTsKCiAgdGVtcGxhdGU8IHR5cGVuYW1lIF9UeSA+CiAgc3RhdGljIFBfcHRy PF9UeT4gbGluZWFyX3ZpcnRfdG9fcGh5cyggX1R5KiApOwoKICBzdGF0aWMgUF9wdHI8dm9pZD4g emVyb19wYWdlOwp9OwojIDYwICJhdXRvL3ZtZW1fYWxsb2MuaCIKIyAxICIuLi9zcmMva2Vybi9z dGF0aWNfaW5pdC5oIiAxCiMgNjEgImF1dG8vdm1lbV9hbGxvYy5oIiAyCiMgNzQgImF1dG8vdm1l bV9hbGxvYy5oIgp0ZW1wbGF0ZTwgdHlwZW5hbWUgX1R5ID4gaW5saW5lIF9UeSAqVm1lbV9hbGxv Yzo6cGh5c190b192aXJ0KCBQX3B0cjxfVHk+IHAgKQp7CiAgcmV0dXJuIChfVHkqKShwLmdldF91 bnNpZ25lZCgpICsga21lbTo6bWVtX3BoeXMpOwp9CgoKCmlubGluZSB2b2lkIFZtZW1fYWxsb2M6 OnBhZ2VfZnJlZSggdm9pZCAqcGFnZSwgaW50IG9yZGVyICkKewoKCgoKICB2bV9vZmZzZXRfdCBw aHlzID0ga21lbTo6dmlydF90b19waHlzKHBhZ2UpOwoKICBpZiAocGh5cyA9PSAweGZmZmZmZmZm KQogICAgcmV0dXJuOwoKCiAgaWYgKHBoeXMgIT0gemVyb19wYWdlLmdldF91bnNpZ25lZCgpKQog ICAgUG1lbV9hbGxvYzo6cGFnZV9mcmVlKFBfcHRyPHZvaWQ+KCh2b2lkKilwaHlzKSk7CgogIHZt X29mZnNldF90IHZhID0gcmVpbnRlcnByZXRfY2FzdDx2bV9vZmZzZXRfdD4ocGFnZSk7CgogIGlm ICh2YSA8IGttZW06Om1lbV9waHlzKQogICAgewoKICAgICAgKHBoeXNfdG9fdmlydChQX3B0cjxw ZF9lbnRyeV90PigocGRfZW50cnlfdCopKAogICAgICAgICBrbWVtOjprZGlyWyh2YSA+PiAyMikg JiAweDNmZl0KICAgICAgICAgJiBDb25maWc6OlBBR0VfTUFTSykpKSlbKHZhID4+IDEyKSAmIDB4 M2ZmXSA9IDA7CgogICAgICBwYWdlX3VubWFwIChwYWdlLCBvcmRlcik7CgogICAgICBrbWVtOjp0 bGJfZmx1c2godmEpOwogICAgfQp9CgoKCmlubGluZSB2b2lkClZtZW1fYWxsb2M6OnBhZ2VfbWFw KHZvaWQgKmFkZHJlc3MsIGludCBvcmRlciwgWmVyb19maWxsIHpmLCB2bV9vZmZzZXRfdCBwaHlz KQp7fQoKCgppbmxpbmUgdm9pZApWbWVtX2FsbG9jOjpwYWdlX3VubWFwKHZvaWQgKmFkZHJlc3Ms IGludCBvcmRlcikKe30KIyAxMzAgImF1dG8vdm1lbV9hbGxvYy5oIgogdGVtcGxhdGU8IHR5cGVu YW1lIF9UeSA+CmlubGluZQpQX3B0cjxfVHk+IFZtZW1fYWxsb2M6OmxpbmVhcl92aXJ0X3RvX3Bo eXMoIF9UeSAqdiApCnsKICByZXR1cm4gUF9wdHI8X1R5PigoKCh2bV9vZmZzZXRfdCl2KSAtIGtt ZW06Om1lbV9waHlzKSk7Cn0KIyA2NiAiYXV0by9rbWVtX2FsbG9jLmgiIDIKIyA3OCAiYXV0by9r bWVtX2FsbG9jLmgiCmlubGluZSB2b2lkICprbWVtX2FsbG9jOjphbGxvYyh2bV9zaXplX3Qgc2l6 ZSkKewojIDg5ICJhdXRvL2ttZW1fYWxsb2MuaCIKICBQX3B0cjx2b2lkPiBiID0gUG1lbV9hbGxv Yzo6dW5hbGlnbmVkX3BhZ2VfYWxsb2MoIChzaXplICsgKENvbmZpZzo6UEFHRV9TSVpFLTEpKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL0NvbmZp Zzo6UEFHRV9TSVpFICk7CiAgaWYoIWIuaXNfbnVsbCgpKQogICAgcmV0dXJuIGttZW06OnBoeXNf dG9fdmlydCgodm1fb2Zmc2V0X3QpYi5nZXRfcmF3KCkpOwogIGVsc2UKICAgIGtkYl9rZSgib3V0 IG9mIG1lbW9yeSEiKTsKICByZXR1cm4gMDsKfQojIDExMCAiYXV0by9rbWVtX2FsbG9jLmgiCmlu bGluZSB2b2lkICoKa21lbV9hbGxvYzo6cGFnZV9hbGxvYyh2bV9vZmZzZXRfdCB2YSwgemVyb19m aWxsX3QgZG9femVyb19maWxsLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlcl9hY2Nl c3NpYmxlKQp7CiAgcmV0dXJuIFZtZW1fYWxsb2M6OnBhZ2VfYWxsb2MoKHZvaWQqKXZhLCAwLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX3plcm9fZmlsbCA9PSBub196ZXJvX2Zp bGwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZtZW1fYWxsb2M6Ok5PX1pFUk9f RklMTCA6ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZG9femVyb19maWxsID09IHplcm9fZmlsbCA/CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZtZW1fYWxsb2M6OlpF Uk9fRklMTCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFZtZW1fYWxsb2M6OlpFUk9fTUFQCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdXNlcl9hY2Nlc3NpYmxlID8KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBQYWdlOjpVU0VSX1JXWCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UGFnZTo6VVNFUl9OTyApOwp9CiMgMTM3ICJhdXRvL2ttZW1fYWxsb2MuaCIKaW5saW5lIHZvaWQg a21lbV9hbGxvYzo6cGFnZV9mcmVlKHZvaWQgKnBhZ2UpCnsKICBWbWVtX2FsbG9jOjpwYWdlX2Zy ZWUocGFnZSwwKTsKfQoKCgoKCgppbmxpbmUgdm9pZCAqCmttZW1fYWxsb2M6OnBhZ2VfYWxsb2Mo KQp7CiAgUF9wdHI8dm9pZD4gYiA9IFBtZW1fYWxsb2M6OnBhZ2VfYWxsb2MoKTsKICBpZighYi5p c19udWxsKCkpCiAgICByZXR1cm4ga21lbTo6cGh5c190b192aXJ0KCh2bV9vZmZzZXRfdCliLmdl dF9yYXcoKSk7CiAgZWxzZQogICAga2RiX2tlKCJvdXQgb2YgbWVtb3J5ISIpOwogIHJldHVybiAw Owp9CiMgMjQgImF1dG8vdGhyZWFkX2kuaCIgMgoKIyAxICJhdXRvL21hcF91dGlsLmgiIDEKCgoK CgoKIyAxICJhdXRvL21hcGRiLmgiIDEKIyAxMyAiYXV0by9tYXBkYi5oIgpzdHJ1Y3QgbWFwcGlu Z190cmVlX3Q7CmNsYXNzIG1hcGRiX3RyZWVfdDsKY2xhc3MgcGh5c2ZyYW1lX3Q7CgoKCmVudW0g bWFwcGluZ190eXBlX3QgeyBNYXBfbWVtID0gMCwgTWFwX2lvIH07CgpzdHJ1Y3QgTWFwcGluZ19l bnRyeQp7CiAgdW5zaWduZWQgc3BhY2U6MTE7CiAgdW5zaWduZWQgc2l6ZToxOwogIHVuc2lnbmVk IGFkZHJlc3M6MjA7CiAgdW5zaWduZWQgZGVwdGg6ODsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQp KTsKIyA0MSAiYXV0by9tYXBkYi5oIgpjbGFzcyBtYXBwaW5nX3QKewogIGZyaWVuZCBjbGFzcyBt YXBkYl90OwogIGZyaWVuZCBjbGFzcyBtYXBwaW5nX3RyZWVfdDsKICBmcmllbmQgY2xhc3MgamRi OwogIGZyaWVuZCBzdHJ1Y3QgcGh5c2ZyYW1lX3Q7CgoKICBtYXBwaW5nX3QoY29uc3QgbWFwcGlu Z190Jik7CgoKICBNYXBwaW5nX2VudHJ5IF9kYXRhOwoKcHVibGljOgoKCgogIHVuc2lnbmVkIHNw YWNlKCk7CgoKCgogIHZtX29mZnNldF90IHZhZGRyKCk7CgoKCgogIHZtX3NpemVfdCBzaXplKCk7 CgoKCgoKICBtYXBwaW5nX3R5cGVfdCB0eXBlKCk7CgoKCgogIG1hcHBpbmdfdCAqIHBhcmVudCgp OwoKCgoKCgoKICBtYXBwaW5nX3QgKiBuZXh0X2l0ZXIoKTsKIyA5NiAiYXV0by9tYXBkYi5oIgog IG1hcHBpbmdfdCAqIG5leHRfY2hpbGQobWFwcGluZ190ICpwYXJlbnQpOwoKcHJpdmF0ZToKICBt YXBwaW5nX3QoKTsKCiAgTWFwcGluZ19lbnRyeSAqIGRhdGEoKTsKCgoKCiAgYm9vbCB1bnVzZWQo KTsKCiAgYm9vbCBpc19lbmRfdGFnKCk7CgogIG1hcHBpbmdfdCogbmV4dChjb25zdCBtYXBwaW5n X3QqIGVuZF9vZl90cmVlKTsKIyAxMTkgImF1dG8vbWFwZGIuaCIKICBtYXBwaW5nX3RyZWVfdCAq IHRyZWUoKTsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCgoKY2xhc3MgbWFwZGJfdAp7CiAg ZnJpZW5kIGNsYXNzIGpkYjsKCgoKCgogIHBoeXNmcmFtZV90KiBwaHlzZnJhbWU7CgoKcHVibGlj OgoKCgoKCgoKICBtYXBkYl90KHZtX29mZnNldF90IGVuZF9vZl9tYWluX21lbW9yeSk7CgoKICB+ bWFwZGJfdCgpOwojIDE2NSAiYXV0by9tYXBkYi5oIgogIHN0YXRpYyBtYXBwaW5nX3QgKiBpbnNl cnQobWFwcGluZ190ICpwYXJlbnQsIHVuc2lnbmVkIHNwYWNlLCB2bV9vZmZzZXRfdCB2YSwgdm1f c2l6ZV90IHNpemUsIG1hcHBpbmdfdHlwZV90IHR5cGUpOwojIDE3OSAiYXV0by9tYXBkYi5oIgog IG1hcHBpbmdfdCAqIGxvb2t1cCh1bnNpZ25lZCBzcGFjZSwgdm1fb2Zmc2V0X3QgdmEsIHZtX29m ZnNldF90IHBoeXMpOwojIDE5MyAiYXV0by9tYXBkYi5oIgogIHZvaWQgZnJlZShtYXBwaW5nX3Qq IG1hcHBpbmdfb2ZfdHJlZSk7CgoKCgoKCgogIHN0YXRpYyB2b2lkIGZsdXNoKG1hcHBpbmdfdCAq bSwgYm9vbCBtZV90b28pOwoKCgoKCgoKICB2b2lkIGdyYW50KG1hcHBpbmdfdCAqbSwgdW5zaWdu ZWQgbmV3X3NwYWNlLCB2bV9vZmZzZXRfdCB2YSk7Cn07CiMgMjI2ICJhdXRvL21hcGRiLmgiCmlu bGluZSBNYXBwaW5nX2VudHJ5ICoKbWFwcGluZ190OjpkYXRhKCkKewogIHJldHVybiAmX2RhdGE7 Cn0KCgoKCgoKaW5saW5lIHVuc2lnbmVkCm1hcHBpbmdfdDo6c3BhY2UoKQp7CiAgcmV0dXJuIGRh dGEoKS0+c3BhY2U7Cn0KCgoKCgoKCmlubGluZSB2bV9vZmZzZXRfdAptYXBwaW5nX3Q6OnZhZGRy KCkKewogIHJldHVybiAoZGF0YSgpLT5hZGRyZXNzIDw8IENvbmZpZzo6UEFHRV9TSElGVCk7Cn0K CgoKCgoKaW5saW5lIHZtX3NpemVfdAptYXBwaW5nX3Q6OnNpemUoKQp7CiAgaWYgKCBkYXRhKCkt PnNpemUgKQogICAgcmV0dXJuIENvbmZpZzo6U1VQRVJQQUdFX1NJWkU7CiAgZWxzZQogICAgcmV0 dXJuIENvbmZpZzo6UEFHRV9TSVpFOwp9CgoKCgoKCgppbmxpbmUgbWFwcGluZ190eXBlX3QKbWFw cGluZ190Ojp0eXBlKCkKewoKICByZXR1cm4gTWFwX21lbTsKfQojIDggImF1dG8vbWFwX3V0aWwu aCIgMgoKCgoKCgpjbGFzcyBTcGFjZTsKCmV4dGVybiBtYXBkYl90JiB0aGVfbWFwZGI7CiMgMzEg ImF1dG8vbWFwX3V0aWwuaCIKdW5zaWduZWQgZnBhZ2VfbWFwKFNwYWNlICpmcm9tLCBMNF9mcGFn ZSBmcF9mcm9tLCBTcGFjZSAqdG8sIEw0X2ZwYWdlIGZwX3RvLCB2bV9vZmZzZXRfdCBvZmZzKTsK IyA0NSAiYXV0by9tYXBfdXRpbC5oIgp2b2lkIGZwYWdlX3VubWFwKFNwYWNlICpzcGFjZSwgTDRf ZnBhZ2UgZnAsIGJvb2wgbWVfdG9vLCBib29sIG9ubHlfcmVhZF9vbmx5KTsKIyA2MCAiYXV0by9t YXBfdXRpbC5oIgp1bnNpZ25lZCBtZW1fZnBhZ2VfbWFwKFNwYWNlICpmcm9tLCBMNF9mcGFnZSBm cF9mcm9tLCBTcGFjZSAqdG8sIEw0X2ZwYWdlIGZwX3RvLCB2bV9vZmZzZXRfdCBvZmZzKTsKIyA3 NCAiYXV0by9tYXBfdXRpbC5oIgp2b2lkIG1lbV9mcGFnZV91bm1hcChTcGFjZSAqc3BhY2UsIEw0 X2ZwYWdlIGZwLCBib29sIG1lX3RvbywgYm9vbCBvbmx5X3JlYWRfb25seSk7CiMgODggImF1dG8v bWFwX3V0aWwuaCIKdW5zaWduZWQgaW9fZnBhZ2VfbWFwKFNwYWNlICpmcm9tLCBMNF9mcGFnZSBm cF9mcm9tLCBTcGFjZSAqdG8sIEw0X2ZwYWdlIGZwX3RvKTsKIyAxMDIgImF1dG8vbWFwX3V0aWwu aCIKdm9pZCBpb19mcGFnZV91bm1hcChTcGFjZSAqc3BhY2UsIEw0X2ZwYWdlIGZwLCBib29sICk7 CiMgMTMxICJhdXRvL21hcF91dGlsLmgiCmlubGluZSB1bnNpZ25lZApmcGFnZV9tYXAoU3BhY2Ug KmZyb20sIEw0X2ZwYWdlIGZwX2Zyb20sIFNwYWNlICp0bywKICAgICAgICAgIEw0X2ZwYWdlIGZw X3RvLCB2bV9vZmZzZXRfdCBvZmZzKQp7CiAgdW5zaWduZWQgcmVzdWx0ID0gMDsKCiAgaWYoQ29u ZmlnOjplbmFibGVfaW9fcHJvdGVjdGlvbiAmJgogICAgIChmcF9mcm9tLmlzX2lvcGFnZSgpCiAg ICAgIHx8IGZwX2Zyb20uaXNfd2hvbGVfc3BhY2UoKSkpCiAgICB7CiAgICAgIHJlc3VsdCB8PSBp b19mcGFnZV9tYXAoZnJvbSwgZnBfZnJvbSwgdG8sIGZwX3RvKTsKICAgIH0KCiAgaWYoIUNvbmZp Zzo6ZW5hYmxlX2lvX3Byb3RlY3Rpb24gfHwgIWZwX2Zyb20uaXNfaW9wYWdlKCkpCiAgICB7CiAg ICAgIHJlc3VsdCB8PSBtZW1fZnBhZ2VfbWFwKGZyb20sIGZwX2Zyb20sIHRvLCBmcF90bywgb2Zm cyk7CiAgICB9CiAgcmV0dXJuIHJlc3VsdDsKfQojIDE2NiAiYXV0by9tYXBfdXRpbC5oIgppbmxp bmUgdm9pZApmcGFnZV91bm1hcChTcGFjZSAqc3BhY2UsIEw0X2ZwYWdlIGZwLCBib29sIG1lX3Rv bywgYm9vbCBvbmx5X3JlYWRfb25seSkKewogIGlmKENvbmZpZzo6ZW5hYmxlX2lvX3Byb3RlY3Rp b24gJiYKICAgICAoZnAuaXNfaW9wYWdlKCkKICAgICAgfHwgZnAuaXNfd2hvbGVfc3BhY2UoKSkp CiAgICB7CiAgICAgIGlvX2ZwYWdlX3VubWFwKHNwYWNlLCBmcCwgbWVfdG9vKTsKICAgIH0KCiAg aWYoIUNvbmZpZzo6ZW5hYmxlX2lvX3Byb3RlY3Rpb24gfHwgIWZwLmlzX2lvcGFnZSgpKQogICAg ewogICAgICBtZW1fZnBhZ2VfdW5tYXAoc3BhY2UsIGZwLCBtZV90b28sIG9ubHlfcmVhZF9vbmx5 KTsKICAgIH0KfQojIDI2ICJhdXRvL3RocmVhZF9pLmgiIDIKCgoKIyAxICJhdXRvL2w0X3N5c2Nh bGxzLmgiIDEKIyAzMCAiYXV0by90aHJlYWRfaS5oIiAyCiMgNTQgImF1dG8vdGhyZWFkX2kuaCIK IyAxICIuLi9zcmMva2Vybi91bmRlZl9vc2tpdC5oIiAxCiMgNTUgImF1dG8vdGhyZWFkX2kuaCIg MgoKIyAxICJhdXRvL2RpcnEuaCIgMQojIDEzICJhdXRvL2RpcnEuaCIKY2xhc3MgZGlycV90IDog cHVibGljIGlycV90CnsKcHVibGljOgoKICBzdGF0aWMgdm9pZCBpbml0KCk7CiAgUmVjZWl2ZXIg Km93bmVyKCkgY29uc3Q7CiAgdm9pZCAqb3BlcmF0b3IgbmV3ICggc2l6ZV90ICk7Cgpwcml2YXRl OgogIGRpcnFfdCgpOwogIGRpcnFfdChkaXJxX3QmKTsKCnB1YmxpYzoKICBleHBsaWNpdCBkaXJx X3QodW5zaWduZWQgaXJxbnVtKTsKCgoKCgoKCiAgYm9vbCBhbGxvYyhSZWNlaXZlciAqdCwgYm9v bCBhY2tfaW5fa2VybmVsKTsKCgoKCgoKICBib29sIGZyZWUoUmVjZWl2ZXIgKnQpOwoKCgoKCgog IHZvaWQgaGl0KCk7Cn07CgoKCgoKZXh0ZXJuICJDIiB2b2lkIGlycV9pbnRlcnJ1cHQodW5zaWdu ZWQgaXJxbnVtKTsKIyA3OSAiYXV0by9kaXJxLmgiCmlubGluZSBib29sIGRpcnFfdDo6YWxsb2Mo UmVjZWl2ZXIgKnQsIGJvb2wgYWNrX2luX2tlcm5lbCkKewogIGJvb2wgcmV0ID0gc21wX2Nhcygm X2lycV90aHJlYWQsIHN0YXRpY19jYXN0PFJlY2VpdmVyKj4oMCksIHQpOwoKICBpZiAocmV0KQog ICAgewogICAgICBpbnQgaXJxID0gaWQoKS5pcnEoKTsKCiAgICAgIF9hY2tfaW5fa2VybmVsID0g YWNrX2luX2tlcm5lbDsKICAgICAgX3F1ZXVlZCA9IDA7CgogICAgICBpZiAoX2Fja19pbl9rZXJu ZWwpCiAgICAgICAgUGljOjplbmFibGUoaXJxKTsKICAgICAgZWxzZQogICAgICAgIFBpYzo6ZGlz YWJsZShpcnEpOwogICAgfQoKICByZXR1cm4gcmV0Owp9CiMgMTA2ICJhdXRvL2RpcnEuaCIKaW5s aW5lIGJvb2wgZGlycV90OjpmcmVlKFJlY2VpdmVyICp0KQp7CiAgYm9vbCByZXQgPSBzbXBfY2Fz KCZfaXJxX3RocmVhZCwgdCwgc3RhdGljX2Nhc3Q8UmVjZWl2ZXIqPigwKSk7CgogIGlmIChyZXQp CiAgICB7CiAgICAgIFBpYzo6ZGlzYWJsZShpZCgpLmlycSgpKTsKICAgICAgc2VuZGVyX2RlcXVl dWUodC0+c2VuZGVyX2xpc3QoKSk7CiAgICB9CgogIHJldHVybiByZXQ7Cn0KIyA1NyAiYXV0by90 aHJlYWRfaS5oIiAyCiMgOTIgImF1dG8vdGhyZWFkX2kuaCIKIyAxICIuLi9zcmMva2Vybi91bmRl Zl9vc2tpdC5oIiAxCiMgOTMgImF1dG8vdGhyZWFkX2kuaCIgMgoKCgojIDEgImdsb2JhbGNvbmZp Zy5oIiAxCiMgOTcgImF1dG8vdGhyZWFkX2kuaCIgMgoKCgoKIyAxICJhdXRvL2tlcm5lbF9jb25z b2xlLmgiIDEKCgoKCgojIDEgImF1dG8vbXV4X2NvbnNvbGUuaCIgMQoKCgoKCgojIDEgImF1dG8v Y29uc29sZS5oIiAxCgoKCgoKIyAxICIvdXNyL2xpYi9nY2Mtc25hcHNob3QvbGliL2djYy1saWIv aTM4Ni1saW51eC8zLjMvaW5jbHVkZS9zdGRkZWYuaCIgMQojIDcgImF1dG8vY29uc29sZS5oIiAy CiMgMTggImF1dG8vY29uc29sZS5oIgpjbGFzcyBDb25zb2xlCnsKcHVibGljOgojIDI5ICJhdXRv L2NvbnNvbGUuaCIKICB2aXJ0dWFsIGludCB3cml0ZSggY2hhciBjb25zdCAqc3RyLCBzaXplX3Qg bGVuICkgPSAwOwojIDM4ICJhdXRvL2NvbnNvbGUuaCIKICB2aXJ0dWFsIGludCBnZXRjaGFyKCBi b29sIGJsb2NraW5nID0gdHJ1ZSApID0gMDsKIyA0OCAiYXV0by9jb25zb2xlLmgiCiAgdmlydHVh bCBpbnQgY2hhcl9hdmFpbCgpIGNvbnN0OwoKICB2aXJ0dWFsIH5Db25zb2xlKCk7CgpwdWJsaWM6 CgoKCgogIHN0YXRpYyB2b2lkIGRpc2FibGVfYWxsKCk7CgoKICBzdGF0aWMgQ29uc29sZSAqc3Rk b3V0OwoKICBzdGF0aWMgQ29uc29sZSAqc3RkZXJyOwoKICBzdGF0aWMgQ29uc29sZSAqc3RkaW47 Cn07CiMgOCAiYXV0by9tdXhfY29uc29sZS5oIiAyCiMgMTkgImF1dG8vbXV4X2NvbnNvbGUuaCIK Y2xhc3MgTXV4X2NvbnNvbGUKICA6IHB1YmxpYyBDb25zb2xlCnsKcHVibGljOgoKICBlbnVtIHsK ICAgIFNJWkUgPSA4CiAgfTsKCiAgTXV4X2NvbnNvbGUoKTsKCiAgaW50IHdyaXRlKCBjaGFyIGNv bnN0ICpzdHIsIHNpemVfdCBsZW4gKTsKICBpbnQgZ2V0Y2hhciggYm9vbCBibG9ja2luZyA9IHRy dWUgKTsKICBpbnQgY2hhcl9hdmFpbCgpIGNvbnN0OwoKCgoKCgogIGJvb2wgcmVnaXN0ZXJfY29u c29sZSggQ29uc29sZSAqY29ucywgaW50IHBvcyA9IDAgKTsKCgoKCgogIGJvb2wgdW5yZWdpc3Rl cl9jb25zb2xlKCBDb25zb2xlICpjb25zICk7Cgpwcml2YXRlOgoKICBpbnQgX2l0ZW1zOwogIENv bnNvbGUgKl9jb25zW1NJWkVdOwoKfTsKIyA3ICJhdXRvL2tlcm5lbF9jb25zb2xlLmgiIDIKCgoK CgoKY2xhc3MgS2NvbnNvbGUgOiBwdWJsaWMgTXV4X2NvbnNvbGUKewpwdWJsaWM6CgogIGludCBn ZXRjaGFyKCBib29sIGJsb2NraW5nID0gdHJ1ZSApOwoKICBzdGF0aWMgTXV4X2NvbnNvbGUgKmNv bnNvbGUoKTsKCnByaXZhdGU6CiAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQ7Cgp9OwojIDEwMiAi YXV0by90aHJlYWRfaS5oIiAyCgoKIyAxICJhdXRvL3Byb2ZpbGUuaCIgMQojIDEzICJhdXRvL3By b2ZpbGUuaCIKY2xhc3MgcHJvZmlsZQp7CiAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGlja3M7CiAg c3RhdGljIGJvb2wgZXhpdDsKCnB1YmxpYzoKCgoKCiAgc3RhdGljIHZvaWQgaW5pdCgpOwoKICBz dGF0aWMgdm9pZCBzdGFydCgpOwoKICBzdGF0aWMgdm9pZCBzdG9wKCk7CgogIHN0YXRpYyB2b2lk IHN0b3BfYW5kX2R1bXAoKTsKCiAgc3RhdGljIHZvaWQgaGFuZGxlX3Byb2ZpbGVfaW50ZXJydXB0 KHZtX29mZnNldF90IHBjKTsKfTsKCmV4dGVybiAiQyIgdm9pZCBwcm9maWxlX2ludGVycnVwdCh2 bV9vZmZzZXRfdCBwYyk7CgpleHRlcm4gIkMiIHZvaWQgcHJvZmlsZV9tY291bnRfd3JhcCh1bnNp Z25lZCBzaG9ydCAqZnJvbXBjaW5kZXgsIGNoYXIgKnNlbGZwYyApOwojIDEwNSAiYXV0by90aHJl YWRfaS5oIiAyCgoKIyAxICJhdXRvL3dhdGNoZG9nLmgiIDEKIyAxMSAiYXV0by93YXRjaGRvZy5o IgpjbGFzcyB3YXRjaGRvZwp7CnB1YmxpYzoKICBzdGF0aWMgdm9pZCAoKnRvdWNoKSh2b2lkKTsK ICBzdGF0aWMgdm9pZCAoKmVuYWJsZSkodm9pZCk7CiAgc3RhdGljIHZvaWQgKCpkaXNhYmxlKSh2 b2lkKTsKCnByaXZhdGU6CiAgd2F0Y2hkb2coKTsKICB3YXRjaGRvZyhjb25zdCB3YXRjaGRvZyYp OwoKICBzdGF0aWMgdm9pZCAoKmluaXRfcGVyZikodm9pZCk7CiAgc3RhdGljIHVuc2lnbmVkIGxv bmcgbG9uZyBubWlfcGVyZjsKCiAgdHlwZWRlZiBzdHJ1Y3QKICAgIHsKICAgICAgdW5zaWduZWQg YWN0aXZlOjE7CiAgICAgIHVuc2lnbmVkIHVzZXJfYWN0aXZlOjE7CiAgICAgIHVuc2lnbmVkIG5v X3VzZXJfY29udHJvbDoxOwogICAgfSB3YXRjaGRvZ19mbGFnc190OwoKICBzdGF0aWMgd2F0Y2hk b2dfZmxhZ3NfdCBmbGFnczsKCnB1YmxpYzoKCiAgc3RhdGljIHZvaWQgdXNlcl9lbmFibGUoKTsK CgogIHN0YXRpYyB2b2lkIHVzZXJfZGlzYWJsZSgpOwoKCiAgc3RhdGljIHZvaWQgdXNlcl90YWtl b3Zlcl9jb250cm9sKCk7CgoKICBzdGF0aWMgdm9pZCB1c2VyX2dpdmViYWNrX2NvbnRyb2woKTsK CiAgc3RhdGljIHZvaWQgaW5pdCgpOwoKcHJpdmF0ZToKCiAgc3RhdGljIHZvaWQgaW5pdF9wZXJm X3A2KCk7CgogIHN0YXRpYyB2b2lkIGVuYWJsZV9wZXJmX25taV9wNigpOwoKICBzdGF0aWMgdm9p ZCBkaXNhYmxlX3BlcmZfbm1pX3A2KCk7CgogIHN0YXRpYyB2b2lkIHRvdWNoX3BlcmZfcDYoKTsK CgogIHN0YXRpYyB2b2lkIGluaXRfcGVyZl9wNCgpOwoKICBzdGF0aWMgdm9pZCBlbmFibGVfcGVy Zl9ubWlfcDQoKTsKCiAgc3RhdGljIHZvaWQgZGlzYWJsZV9wZXJmX25taV9wNCgpOwoKICBzdGF0 aWMgdm9pZCB0b3VjaF9wZXJmX3A0KCk7CgoKICBzdGF0aWMgdm9pZCBpbml0X3BlcmZfazcoKTsK CiAgc3RhdGljIHZvaWQgZW5hYmxlX3BlcmZfbm1pX2s3KCk7CgogIHN0YXRpYyB2b2lkIGRpc2Fi bGVfcGVyZl9ubWlfazcoKTsKCiAgc3RhdGljIHZvaWQgdG91Y2hfcGVyZl9rNygpOwp9OwojIDg3 ICJhdXRvL3dhdGNoZG9nLmgiCmlubGluZSB2b2lkCndhdGNoZG9nOjp1c2VyX2VuYWJsZSgpCnsK ICBmbGFncy51c2VyX2FjdGl2ZSA9IDE7CiAgZW5hYmxlKCk7Cn0KCgoKCmlubGluZSB2b2lkCndh dGNoZG9nOjp1c2VyX2Rpc2FibGUoKQp7CiAgZmxhZ3MudXNlcl9hY3RpdmUgPSAwOwogIGRpc2Fi bGUoKTsKfQoKCgoKaW5saW5lIHZvaWQKd2F0Y2hkb2c6OnVzZXJfdGFrZW92ZXJfY29udHJvbCgp CnsKICBmbGFncy5ub191c2VyX2NvbnRyb2wgPSAwOwp9CgoKCgppbmxpbmUgdm9pZAp3YXRjaGRv Zzo6dXNlcl9naXZlYmFja19jb250cm9sKCkKewogIGZsYWdzLm5vX3VzZXJfY29udHJvbCA9IDA7 Cn0KIyAxMDggImF1dG8vdGhyZWFkX2kuaCIgMgoKCgoKIyAxICIuLi9zcmMva2Vybi91bmRlZl9v c2tpdC5oIiAxCiMgMTEzICJhdXRvL3RocmVhZF9pLmgiIDIKCgojIDEgIi4uL3NyYy9rZXJuL3Vu ZGVmX29za2l0LmgiIDEKIyAxMTYgImF1dG8vdGhyZWFkX2kuaCIgMgojIDEyNSAiYXV0by90aHJl YWRfaS5oIgojIDEgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9hbGxvY2EuaCIgMQoKCiMg MSAiL3Vzci9saWIvZ2NjLXNuYXBzaG90L2xpYi9nY2MtbGliL2kzODYtbGludXgvMy4zL2luY2x1 ZGUvc3RkZGVmLmgiIDEKIyA0ICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1ZGUvYWxsb2NhLmgi IDIKCgpleHRlcm4gIkMiIHsKCnZvaWQgKmFsbG9jYShzaXplX3QpOwoKfQojIDEyNiAiYXV0by90 aHJlYWRfaS5oIiAyCgojIDEgImF1dG8vamRiX3RyYWNlLmgiIDEKIyAxMSAiYXV0by9qZGJfdHJh Y2UuaCIKY2xhc3MgamRiX3RyYWNlCnsKcHJpdmF0ZToKCiAgdHlwZWRlZiBzdHJ1Y3QKICAgIHsK ICAgICAgaW50IG90aGVyOwogICAgICBpbnQgdGhyZWFkOwogICAgICBpbnQgcGZhX3Jlc19zZXQ7 CiAgICAgIHVuc2lnbmVkIHk7CiAgICAgIHVuc2lnbmVkIHo7CiAgICB9IHBmX3Jlc190OwoKCiAg dHlwZWRlZiBzdHJ1Y3QKICAgIHsKICAgICAgaW50IG90aGVyOwogICAgICBpbnQgdGhyZWFkOwog ICAgICBpbnQgc2VuZF9vbmx5OwogICAgfSBpcGNfcmVzX3Q7CgoKICB0eXBlZGVmIHN0cnVjdAog ICAgewogICAgICBpbnQgb3RoZXI7CiAgICAgIGludCB0aHJlYWQ7CiAgICAgIGludCBhZGRyX3Nl dDsKICAgICAgdW5zaWduZWQgeTsKICAgICAgdW5zaWduZWQgejsKICAgIH0gdW5tYXBfcmVzX3Q7 CgogIHN0YXRpYyBwZl9yZXNfdCBwZl9yZXM7CiAgc3RhdGljIGlwY19yZXNfdCBpcGNfcmVzOwog IHN0YXRpYyB1bm1hcF9yZXNfdCB1bm1hcF9yZXM7CgpwdWJsaWM6CiAgc3RhdGljIHZvaWQgZ2V0 X3BmX3JlcyhpbnQgKm90aGVyLCBpbnQgKnRocmVhZCwgaW50ICpwZmFfc2V0LCB1bnNpZ25lZCAq eSwgdW5zaWduZWQgKnopOwoKICBzdGF0aWMgdm9pZCBzZXRfcGZfcmVzKGludCBvdGhlciwgaW50 IHRocmVhZCwgaW50IHBmYV9zZXQsIHVuc2lnbmVkIHksIHVuc2lnbmVkIHopOwoKICBzdGF0aWMg dm9pZCBjbGVhcl9wZl9yZXMoKTsKCiAgc3RhdGljIHZvaWQgZ2V0X3VubWFwX3JlcyhpbnQgKm90 aGVyLCBpbnQgKnRocmVhZCwgaW50ICphZGRyX3NldCwgdW5zaWduZWQgKnksIHVuc2lnbmVkICp6 KTsKCiAgc3RhdGljIHZvaWQgc2V0X3VubWFwX3JlcyhpbnQgb3RoZXIsIGludCB0aHJlYWQsIGlu dCBhZGRyX3NldCwgdW5zaWduZWQgeSwgdW5zaWduZWQgeik7CgogIHN0YXRpYyB2b2lkIGNsZWFy X3VubWFwX3JlcygpOwoKICBzdGF0aWMgdm9pZCBnZXRfaXBjX3JlcyhpbnQgKm90aGVyLCBpbnQg KnRocmVhZCwgaW50ICpzZW5kX29ubHkpOwoKICBzdGF0aWMgdm9pZCBzZXRfaXBjX3JlcyhpbnQg b3RoZXIsIGludCB0aHJlYWQsIGludCBzZW5kX29ubHkpOwoKICBzdGF0aWMgdm9pZCBjbGVhcl9p cGNfcmVzKCk7Cn07CiMgNzMgImF1dG8vamRiX3RyYWNlLmgiCmlubGluZSB2b2lkCmpkYl90cmFj ZTo6Z2V0X3BmX3JlcyhpbnQgKm90aGVyLCBpbnQgKnRocmVhZCwKICAgICAgICAgICAgICAgICAg ICAgIGludCAqcGZhX3NldCwgdW5zaWduZWQgKnksIHVuc2lnbmVkICp6KQp7CiAgKm90aGVyID0g cGZfcmVzLm90aGVyOwogICp0aHJlYWQgPSBwZl9yZXMudGhyZWFkOwogICpwZmFfc2V0ID0gcGZf cmVzLnBmYV9yZXNfc2V0OwogICp5ID0gcGZfcmVzLnk7CiAgKnogPSBwZl9yZXMuejsKfQoKCgpp bmxpbmUgdm9pZApqZGJfdHJhY2U6OmdldF91bm1hcF9yZXMoaW50ICpvdGhlciwgaW50ICp0aHJl YWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFkZHJfc2V0LCB1bnNpZ25lZCAqeSwg dW5zaWduZWQgKnopCnsKICAqb3RoZXIgPSB1bm1hcF9yZXMub3RoZXI7CiAgKnRocmVhZCA9IHVu bWFwX3Jlcy50aHJlYWQ7CiAgKmFkZHJfc2V0ID0gdW5tYXBfcmVzLmFkZHJfc2V0OwogICp5ID0g dW5tYXBfcmVzLnk7CiAgKnogPSB1bm1hcF9yZXMuejsKfQoKCgppbmxpbmUgdm9pZApqZGJfdHJh Y2U6OmdldF9pcGNfcmVzKGludCAqb3RoZXIsIGludCAqdGhyZWFkLCBpbnQgKnNlbmRfb25seSkK ewogICpvdGhlciA9IGlwY19yZXMub3RoZXI7CiAgKnRocmVhZCA9IGlwY19yZXMudGhyZWFkOwog ICpzZW5kX29ubHkgPSBpcGNfcmVzLnNlbmRfb25seTsKfQojIDEyOCAiYXV0by90aHJlYWRfaS5o IiAyCgoKCgojIDEgIi4uL3NyYy9rZXJuL3VuZGVmX29za2l0LmgiIDEKIyAxMzMgImF1dG8vdGhy ZWFkX2kuaCIgMgojIDUgImF1dG8vdGhyZWFkLWxvZy5jYyIgMgojIDI0ICIuLi9zcmMva2Vybi9p YTMyL3RocmVhZC1sb2cuY3BwIgoKYm9vbCBsb2dfaXBjID0gZmFsc2U7CiMgMjYgIi4uL3NyYy9r ZXJuL2lhMzIvdGhyZWFkLWxvZy5jcHAiCmJvb2wgbG9nX2lwY190b19idWYgPSBmYWxzZTsKIyAy NyAiLi4vc3JjL2tlcm4vaWEzMi90aHJlYWQtbG9nLmNwcCIKYm9vbCBsb2dfaXBjX3Jlc3VsdCA9 IGZhbHNlOwojIDI4ICIuLi9zcmMva2Vybi9pYTMyL3RocmVhZC1sb2cuY3BwIgpib29sIGxvZ19w YWdlX2ZhdWx0ID0gZmFsc2U7CiMgMjkgIi4uL3NyYy9rZXJuL2lhMzIvdGhyZWFkLWxvZy5jcHAi CmJvb2wgbG9nX3BmX3RvX2J1ZiA9IGZhbHNlOwojIDMwICIuLi9zcmMva2Vybi9pYTMyL3RocmVh ZC1sb2cuY3BwIgpib29sIGxvZ191bm1hcCA9IGZhbHNlOwojIDMxICIuLi9zcmMva2Vybi9pYTMy L3RocmVhZC1sb2cuY3BwIgpib29sIGxvZ191bm1hcF90b19idWYgPSBmYWxzZTsKIyAzMiAiLi4v c3JjL2tlcm4vaWEzMi90aHJlYWQtbG9nLmNwcCIKYm9vbCB0cmFjZV9pcGMgPSBmYWxzZTsKIyAz MyAiLi4vc3JjL2tlcm4vaWEzMi90aHJlYWQtbG9nLmNwcCIKYm9vbCBzbG93X2lwYyA9IGZhbHNl OwojIDM0ICIuLi9zcmMva2Vybi9pYTMyL3RocmVhZC1sb2cuY3BwIgoKCgoKCmJvb2wgbG9nX3N5 c3RlbV9jYWxsID0gZmFsc2U7CiMgNDAgIi4uL3NyYy9rZXJuL2lhMzIvdGhyZWFkLWxvZy5jcHAi CgpzdGF0aWMgY2hhciAqIGNvbnN0IHN5c2NhbGxfbmFtZXNbXSA9CnsKICAiSVBDIiwgIklETiIs ICJGUFUiLCAiU1dJIiwgIlNDSCIsICJFWFIiLCAiVE5XIgp9OwojIDQ1ICIuLi9zcmMva2Vybi9p YTMyL3RocmVhZC1sb2cuY3BwIgoKCnN0YXRpYyBjaGFyIGxvZ19tZXNzYWdlWzgwXTsKIyA0OCAi Li4vc3JjL2tlcm4vaWEzMi90aHJlYWQtbG9nLmNwcCIKCgppbmxpbmUgdm9pZApUaHJlYWQ6OnN5 c2NhbGxfbG9nKFN5c2NhbGxfZnJhbWUgKiAsIHVuc2lnbmVkIG51bWJlciwKICAgICAgICAgICAg ICAgICAgICBib29sIGVudGVyLCB1bnNpZ25lZCByZXR2YWwpCnsKICBMb2NrX2d1YXJkPENwdV9s b2NrPiBndWFyZCAoJmNwdV9sb2NrKTsKCiAgcHJpbnRmKCIqUyVjWyV4LiV4ICVzIiwKICAgICAg ICAgZW50ZXIgPyAnYycgOiAncicsCiAgICAgICAgIGlkKCkudGFzaygpLCBpZCgpLmx0aHJlYWQo KSwKICAgICAgICAgc3lzY2FsbF9uYW1lc1tudW1iZXJdKTsKCiAgaWYgKCFlbnRlcikKICAgIHBy aW50ZigiIC0+ICV4IiwgcmV0dmFsKTsKCiAgcHJpbnRmKCJdICIpOwp9CiMgNjYgIi4uL3NyYy9r ZXJuL2lhMzIvdGhyZWFkLWxvZy5jcHAiCgpleHRlcm4gIkMiIHZvaWQKdGhyZWFkX3N5c2NhbGxf bG9nX2JlZ2luKFRocmVhZCAqdCwgU3lzY2FsbF9mcmFtZSAqcmVncywgdW5zaWduZWQgbnVtYmVy KQp7CiAgdC0+c3lzY2FsbF9sb2cocmVncywgbnVtYmVyLCB0cnVlLDApOwp9CiMgNzIgIi4uL3Ny Yy9rZXJuL2lhMzIvdGhyZWFkLWxvZy5jcHAiCgpleHRlcm4gIkMiIHZvaWQKdGhyZWFkX3N5c2Nh bGxfbG9nX2VuZCh1bnNpZ25lZCByZXR2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFk ICp0LCBTeXNjYWxsX2ZyYW1lICpyZWdzLCB1bnNpZ25lZCBudW1iZXIpCnsKICB0LT5zeXNjYWxs X2xvZyhyZWdzLCBudW1iZXIsIGZhbHNlLHJldHZhbCk7Cn0KIyA3OSAiLi4vc3JjL2tlcm4vaWEz Mi90aHJlYWQtbG9nLmNwcCIKCgoKCgoKCk13b3JkIFRocmVhZDo6c3lzX2lwY19sb2coU3lzY2Fs bF9mcmFtZSAqaV9yZWdzKQp7CiAgRW50cnlfZnJhbWUgKnJlZ3MgPSByZWludGVycHJldF9jYXN0 PEVudHJ5X2ZyYW1lKj4oaV9yZWdzKTsKICBTeXNfaXBjX2ZyYW1lICppcGNfcmVncyA9IHN0YXRp Y19jYXN0PFN5c19pcGNfZnJhbWUqPihpX3JlZ3MpOwoKICBpbnQgb3RoZXIsIHRocmVhZCwgc2Vu ZF9vbmx5OwogIGludCBnbG9iYWwgPSBpZCgpLnRhc2soKSoxMjggKyBpZCgpLmx0aHJlYWQoKTsK ICB1bnNpZ25lZCBlbnRyeV9ldmVudF9udW0gPSAweGZmZmZmZmZmOwogIGNoYXIgaGF2ZV9zZW5k X3BhcnQgPSBpcGNfcmVncy0+c25kX2Rlc2MoKS5oYXNfc2VuZCgpOwoKICBqZGJfdHJhY2U6Omdl dF9pcGNfcmVzKCZvdGhlciwgJnRocmVhZCwgJnNlbmRfb25seSk7CgogIGludCBkb19sb2cgPSAo ICgodGhyZWFkID09IC0xKSB8fCAoKG90aGVyKSBeICh0aHJlYWQgPT0gZ2xvYmFsKSkpCiAgICAg ICAgICAgICAgICAmJiAoKCFzZW5kX29ubHkgfHwgaGF2ZV9zZW5kX3BhcnQgKSkpOwoKCiAgY3B1 X2xvY2subG9jaygpOwoKICBpZiAoZG9fbG9nKQogICAgewogICAgICBqZGJfdGJ1Zjo6VGJfZW50 cnkgKnRiZSA9IGxvZ19pcGNfdG9fYnVmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg PyBqZGJfdGJ1Zjo6bmV3X2VudHJ5KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6 IChqZGJfdGJ1Zjo6VGJfZW50cnkqKQogICAgICAgIGFsbG9jYShzaXplb2YoamRiX3RidWY6OlRi X2VudHJ5KSk7CgogICAgICB0YmUtPnR5cGUgPSAyOwogICAgICB0YmUtPmN1cnJlbnQgPSB0aGlz OwogICAgICByZWdpc3RlciB1bnNpZ25lZCB0bXAxLCB0bXAyLCB0bXAzOwogICAgICB0bXAxID0g cmVncy0+ZWlwOwogICAgICB0bXAyID0gcmVncy0+ZWF4OwogICAgICB0bXAzID0gcmVncy0+ZWJw OwogICAgICB0YmUtPmVpcCA9IHRtcDE7CiAgICAgIHRiZS0+bS5pcGMuZWF4ID0gdG1wMjsKICAg ICAgdGJlLT5tLmlwYy5lYnAgPSB0bXAzOwogICAgICB0bXAxID0gcmVncy0+ZWR4OwogICAgICB0 bXAyID0gcmVncy0+ZWJ4OwogICAgICB0YmUtPm0uaXBjLmVkeCA9IHRtcDE7CiAgICAgIHRiZS0+ bS5pcGMuZWJ4ID0gdG1wMjsKICAgICAgdGJlLT5tLmlwYy5kZXN0ID0gaXBjX3JlZ3MtPnNuZF9k ZXN0KCkucmF3KCk7CgogICAgICBlbnRyeV9ldmVudF9udW0gPSB0YmUtPm51bWJlcjsKCiAgICAg IGlmIChsb2dfaXBjX3RvX2J1ZikKICAgICAgICBqZGJfdGJ1Zjo6Y29tbWl0X2VudHJ5KCk7CiAg ICAgIGVsc2UKICAgICAgICB7CgoKICAgICAgICAgIFByb2M6OlN0YXR1cyBzID0gUHJvYzo6Y2xp X3NhdmUoKTsKCiAgICAgICAgICBqZGJfdGJ1Zjo6cHJpbnRfZW50cnkodGJlLCBsb2dfbWVzc2Fn ZSwgc2l6ZW9mKGxvZ19tZXNzYWdlKSk7CiAgICAgICAgICBwcmludGYoIiVzXG4iLCBsb2dfbWVz c2FnZSk7CgoKCiAgICAgICAgICBpbnQgYzsKICAgICAgICAgIHdoaWxlKChjPUtjb25zb2xlOjpj b25zb2xlKCktPmdldGNoYXIoZmFsc2UpKSA9PSAtMSkKICAgICAgICAgICAgUHJvYzo6cGF1c2Uo KTsKICAgICAgICAgIGlmKCBjID09ICdpJykKICAgICAgICAgICAgYXNtKCAiaW50CSQzCVxuXHQi ICJqbXAJMWYJXG5cdCIgIi5hc2NpaSBcIiIiSVBDIiAiXCIJXG5cdCIgIjE6CQkJXG5cdCIgIm5v cDtub3A7bm9wCVxuXHQiICk7CgoKICAgICAgICAgIFByb2M6OnN0aV9yZXN0b3JlKHMpOwogICAg ICAgIH0KICAgIH0KCgogIHVuc2lnbmVkIHJldDsKCiAgYm9vbCBzdWNjZXNzID0gaXBjX3Nob3J0 X2N1dCgoU3lzX2lwY19mcmFtZSopaV9yZWdzKTsKCiAgY3B1X2xvY2suY2xlYXIoKTsKCiAgcmV0 ID0gcmVncy0+ZWF4OwogIGlmICghc3VjY2VzcykKICAgIHJldCA9IHN5c19pcGMocmVncyk7Cgog IGlmIChsb2dfaXBjICYmIGxvZ19pcGNfcmVzdWx0ICYmIGRvX2xvZykKICAgIHsKICAgICAgY3B1 X2xvY2subG9jaygpOwoKICAgICAgamRiX3RidWY6OlRiX2VudHJ5ICp0YmUgPSBsb2dfaXBjX3Rv X2J1ZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gamRiX3RidWY6Om5ld19lbnRy eSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoamRiX3RidWY6OlRiX2VudHJ5 KikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYShzaXplb2Yo amRiX3RidWY6OlRiX2VudHJ5KSk7CgogICAgICB0YmUtPnR5cGUgPSAzOwogICAgICB0YmUtPmN1 cnJlbnQgPSB0aGlzOwogICAgICB0YmUtPm0uaXBjX3Jlcy5lYXggPSByZXQ7CiAgICAgIHJlZ2lz dGVyIHVuc2lnbmVkIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgIHRtcDEgPSByZWdzLT5laXA7CiAg ICAgIHRtcDIgPSByZWdzLT5lZHg7CiAgICAgIHRtcDMgPSByZWdzLT5lYng7CiAgICAgIHRiZS0+ ZWlwID0gdG1wMTsKICAgICAgdGJlLT5tLmlwY19yZXMuZWR4ID0gdG1wMjsKICAgICAgdGJlLT5t LmlwY19yZXMuZWJ4ID0gdG1wMzsKICAgICAgdGJlLT5tLmlwY19yZXMucmVmX2V2ZW50ID0gZW50 cnlfZXZlbnRfbnVtOwogICAgICB0YmUtPm0uaXBjX3Jlcy5oYXZlX3NlbmQgPSBoYXZlX3NlbmRf cGFydDsKICAgICAgdGJlLT5tLmlwY19yZXMub3JpZ19lYnAgPSByZWdzLT5lYnA7CiAgICAgIHRi ZS0+bS5pcGNfcmVzLnNyYyA9IGlwY19yZWdzLT5yY3Zfc291cmNlKCkucmF3KCk7CgogICAgICBp ZiAobG9nX2lwY190b19idWYpCiAgICAgICAgamRiX3RidWY6OmNvbW1pdF9lbnRyeSgpOwogICAg ICBlbHNlCiAgICAgICAgewoKCiAgICAgICAgICBqZGJfdGJ1Zjo6cHJpbnRfZW50cnkodGJlLCBs b2dfbWVzc2FnZSwgc2l6ZW9mKGxvZ19tZXNzYWdlKSk7CiAgICAgICAgICBwcmludGYoIiVzXG4i LCBsb2dfbWVzc2FnZSk7CgoKCiAgICAgICAgICBpbnQgYzsKICAgICAgICAgIHdoaWxlKChjPUtj b25zb2xlOjpjb25zb2xlKCktPmdldGNoYXIoZmFsc2UpKSA9PSAtMSkKICAgICAgICAgICAgUHJv Yzo6cGF1c2UoKTsKICAgICAgICAgIGlmKCBjID09ICdpJykKICAgICAgICAgICAgYXNtKCAiaW50 CSQzCVxuXHQiICJqbXAJMWYJXG5cdCIgIi5hc2NpaSBcIiIiSVBDIiAiXCIJXG5cdCIgIjE6CQkJ XG5cdCIgIm5vcDtub3A7bm9wCVxuXHQiICk7CgogICAgICAgIH0KCiAgICAgIGNwdV9sb2NrLmNs ZWFyKCk7CiAgICB9CgogIHJldHVybiByZXQ7Cn0KIyAyMTEgIi4uL3NyYy9rZXJuL2lhMzIvdGhy ZWFkLWxvZy5jcHAiCgoKCgoKCgp1bnNpZ25lZApUaHJlYWQ6OnN5c19pcGNfdHJhY2UoU3lzY2Fs bF9mcmFtZSAqaV9yZWdzKQp7CiAgRW50cnlfZnJhbWUgKmVmID0gcmVpbnRlcnByZXRfY2FzdDxF bnRyeV9mcmFtZSo+KGlfcmVncyk7CiAgU3lzX2lwY19mcmFtZSAqcmVncyA9IHN0YXRpY19jYXN0 PFN5c19pcGNfZnJhbWUqPihpX3JlZ3MpOwoKICB1bnNpZ25lZCBvcmlnX2VheCA9IHJlZ3MtPmVh eDsKICB1bnNpZ25lZCBvcmlnX2VicCA9IHJlZ3MtPmVicDsKICBMNF91aWQgb3JpZ19lc2lfZWRp ID0gcmVncy0+c25kX2Rlc3QoKTsKICB1bnNpZ25lZCBsb25nIGxvbmcgb3JpZ190c2M7CgoKICBj cHVfbG9jay5sb2NrKCk7CiAgYXNtIHZvbGF0aWxlKCJyZHRzYyIgOiAiPUEiIChvcmlnX3RzYykp OwoKCiAgcmVnaXN0ZXIgYm9vbCBzdWNjZXNzID0gaXBjX3Nob3J0X2N1dChyZWdzKTsKICB1bnNp Z25lZCByZXQgPSByZWdzLT5lYXg7CgogIGlmICghc3VjY2VzcykKICAgIHsKCiAgICAgIGNwdV9s b2NrLmNsZWFyKCk7CiAgICAgIHJldCA9IHN5c19pcGMocmVncyk7CiAgICAgIGNwdV9sb2NrLmxv Y2soKTsKICAgIH0KCgogIGpkYl90YnVmOjpUYl9lbnRyeSAqdGJlID0gamRiX3RidWY6Om5ld19l bnRyeSgpOwojIDI2OCAiLi4vc3JjL2tlcm4vaWEzMi90aHJlYWQtbG9nLmNwcCIKICB0YmUtPnR5 cGUgPSA0OwogIHRiZS0+Y3VycmVudCA9IHRoaXM7CiAgdGJlLT5laXAgPSBlZi0+ZWlwOwogIHRi ZS0+bS5pcGNfdHJhY2Uuc2VuZF90c2MgPSBvcmlnX3RzYzsKICB0YmUtPm0uaXBjX3RyYWNlLnNl bmRfZXNpX2VkaSA9IG9yaWdfZXNpX2VkaS5yYXcoKTsKICB0YmUtPm0uaXBjX3RyYWNlLnJlY3Zf ZXNpX2VkaSA9IHJlZ3MtPnJjdl9zb3VyY2UoKS5yYXcoKTsKICB0YmUtPm0uaXBjX3RyYWNlLmRv cGUubXNnZG9wZSA9IHJldDsKICB0YmUtPm0uaXBjX3RyYWNlLnNlbmRfZGVzYyA9ICgob3JpZ19l YXggPT0gMHhmZmZmZmZmZikgfHwgKG9yaWdfZWF4IDw9IDMpKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPyAodW5zaWduZWQgY2hhcikgb3JpZ19lYXgKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDogKHVuc2lnbmVkIGNoYXIpICgob3JpZ19lYXggJiAzKSB8IDQp OwogIHRiZS0+bS5pcGNfdHJhY2UucmVjdl9kZXNjID0gKChvcmlnX2VicCA9PSAweGZmZmZmZmZm KSB8fCAob3JpZ19lYnAgPCAyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8g KHVuc2lnbmVkIGNoYXIpIG9yaWdfZWJwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA6ICh1bnNpZ25lZCBjaGFyKSAoKG9yaWdfZWJwICYgMykgfCA0KTsKCiAgamRiX3RidWY6OmNv bW1pdF9lbnRyeSgpOwoKCiAgY3B1X2xvY2suY2xlYXIoKTsKICByZXR1cm4gcmV0Owp9CiMgMjg4 ICIuLi9zcmMva2Vybi9pYTMyL3RocmVhZC1sb2cuY3BwIgoKCmV4dGVybiAiQyIgdm9pZCBzeXNf aXBjX2VudHJ5X2xvZyh2b2lkKTsKIyAyOTEgIi4uL3NyYy9rZXJuL2lhMzIvdGhyZWFkLWxvZy5j cHAiCgp2b2lkClRocmVhZDo6aG9va19pcGNfdmVjdG9yKCkKewoKCgogIGlmICh0cmFjZV9pcGMp CiAgICBzeXNjYWxsX3RhYmxlWzBdID0gJlRocmVhZDo6c3lzX2lwY190cmFjZTsKICBlbHNlIGlm IChsb2dfaXBjKQogICAgc3lzY2FsbF90YWJsZVswXSA9ICZUaHJlYWQ6OnN5c19pcGNfbG9nOwog IGVsc2UKICAgIHN5c2NhbGxfdGFibGVbMF0gPSAmVGhyZWFkOjpzeXNfaXBjOwoKICBmaWxsX2dh dGUoa21lbTo6aWR0KCkgKyAweDMwLCAodW5zaWduZWQpc3lzX2lwY19lbnRyeV9sb2csCiAgICAg ICAgICAgIGttZW06OmdkdF9jb2RlX2tlcm5lbCwgMHg2MCB8IDB4MGUsIDApOwp9CiMgMzA4ICIu Li9zcmMva2Vybi9pYTMyL3RocmVhZC1sb2cuY3BwIgoKZXh0ZXJuICJDIiB2b2lkIHN5c19pcGNf ZW50cnkodm9pZCk7CiMgMzEwICIuLi9zcmMva2Vybi9pYTMyL3RocmVhZC1sb2cuY3BwIgoKdm9p ZApUaHJlYWQ6OnJlc3RvcmVfaXBjX3ZlY3RvcigpCnsKCiAgaWYgKCF0cmFjZV9pcGMpCiAgICB7 CgoKICAgICAgaWYgKCFsb2dfaXBjKQogICAgICAgIHsKICAgICAgICAgIHN5c2NhbGxfdGFibGVb MF0gPSAmVGhyZWFkOjpzeXNfaXBjOwogICAgICAgICAgaWYgKCFzbG93X2lwYykKICAgICAgICAg ICAgZmlsbF9nYXRlKGttZW06OmlkdCgpICsgMHgzMCwgKHVuc2lnbmVkKXN5c19pcGNfZW50cnks CiAgICAgICAgICAgICAgICAgICAgICBrbWVtOjpnZHRfY29kZV9rZXJuZWwsIDB4NjAgfCAweDBl LCAwKTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICBzeXNjYWxsX3RhYmxlWzBdID0gJlRo cmVhZDo6c3lzX2lwY19sb2c7CiAgICB9Cn0KIyAzMzAgIi4uL3NyYy9rZXJuL2lhMzIvdGhyZWFk LWxvZy5jcHAiCgoKCgoKdm9pZApUaHJlYWQ6OnBhZ2VfZmF1bHRfbG9nKHZtX29mZnNldF90IHBm YSwgdW5zaWduZWQgZXJyb3JfY29kZSwgdW5zaWduZWQgZWlwKQp7CiAgaW50IG90aGVyLCB0aHJl YWQsIHBmYV9zZXQ7CiAgdW5zaWduZWQgeSwgejsKCiAgVGhyZWFkICp0ID0gY3VycmVudF90aHJl YWQoKTsKICBpbnQgZ2xvYmFsID0gdC0+aWQoKS50YXNrKCkgKiAxMjggKyB0LT5pZCgpLmx0aHJl YWQoKTsKCiAgamRiX3RyYWNlOjpnZXRfcGZfcmVzKCZvdGhlciwgJnRocmVhZCwgJnBmYV9zZXQs ICZ5LCAmeik7CgogIGlmICggKCgodGhyZWFkID09IC0xKSB8fCAoKG90aGVyKSBeICh0aHJlYWQg PT0gZ2xvYmFsKSkpCiAgICAgICYmICghcGZhX3NldCB8fCAoKHkgPiB6KSBeICgocGZhID49IHkp ICYmIChwZmEgPD0geikpKSApKSkKICAgIHsKICAgICAgTG9ja19ndWFyZCA8Q3B1X2xvY2s+IGd1 YXJkICgmY3B1X2xvY2spOwoKICAgICAgamRiX3RidWY6OlRiX2VudHJ5ICp0YmUgPSBsb2dfcGZf dG9fYnVmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBqZGJfdGJ1Zjo6bmV3X2Vu dHJ5KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChqZGJfdGJ1Zjo6VGJfZW50 cnkqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhKHNpemVv ZihqZGJfdGJ1Zjo6VGJfZW50cnkpKTsKCiAgICAgIHRiZS0+dHlwZSA9IDE7CiAgICAgIHRiZS0+ ZWlwID0gZWlwOwogICAgICB0YmUtPmN1cnJlbnQgPSB0aGlzOwogICAgICB0YmUtPm0ucGYucGZh ID0gcGZhOwogICAgICB0YmUtPm0ucGYuZXJyID0gZXJyb3JfY29kZTsKCiAgICAgIGlmIChsb2df cGZfdG9fYnVmKQogICAgICAgIGpkYl90YnVmOjpjb21taXRfZW50cnkoKTsKICAgICAgZWxzZQog ICAgICAgIHsKCiAgICAgICAgICBQcm9jOjpTdGF0dXMgcyA9IFByb2M6OmNsaV9zYXZlKCk7Cgog ICAgICAgICAgamRiX3RidWY6OnByaW50X2VudHJ5KHRiZSwgbG9nX21lc3NhZ2UsIHNpemVvZihs b2dfbWVzc2FnZSkpOwogICAgICAgICAgcHJpbnRmKCIlc1xuIiwgbG9nX21lc3NhZ2UpOwoKCgog ICAgICAgICAgaW50IGM7CiAgICAgICAgICB3aGlsZSgoYz1LY29uc29sZTo6Y29uc29sZSgpLT5n ZXRjaGFyKGZhbHNlKSkgPT0gLTEpCiAgICAgICAgICAgIFByb2M6OnBhdXNlKCk7CiAgICAgICAg ICBpZiggYyA9PSAnaScpCiAgICAgICAgICAgIGFzbSggImludAkkMwlcblx0IiAiam1wCTFmCVxu XHQiICIuYXNjaWkgXCIiIklQQyIgIlwiCVxuXHQiICIxOgkJCVxuXHQiICJub3A7bm9wO25vcAlc blx0IiApOwoKCiAgICAgICAgICBQcm9jOjpzdGlfcmVzdG9yZShzKTsKCiAgICAgICAgfQogICAg fQp9CiMgMzg2ICIuLi9zcmMva2Vybi9pYTMyL3RocmVhZC1sb2cuY3BwIgoKCgp1bnNpZ25lZApU aHJlYWQ6OnN5c19mcGFnZV91bm1hcF9sb2coU3lzY2FsbF9mcmFtZSAqcmVncykKewogIEVudHJ5 X2ZyYW1lICplZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8RW50cnlfZnJhbWUqPihyZWdzKTsKICBpbnQg b3RoZXI7CiAgaW50IHRocmVhZDsKICBpbnQgYWRkcl9zZXQ7CiAgdW5zaWduZWQgeSwgejsKICB1 bnNpZ25lZCBhZGRyID0gcmVncy0+ZWF4ICYgQ29uZmlnOjpQQUdFX01BU0s7CgogIFRocmVhZCAq dCA9IGN1cnJlbnRfdGhyZWFkKCk7CiAgaW50IGdsb2JhbCA9IHQtPmlkKCkudGFzaygpICogMTI4 ICsgdC0+aWQoKS5sdGhyZWFkKCk7CgogIGpkYl90cmFjZTo6Z2V0X3VubWFwX3Jlcygmb3RoZXIs ICZ0aHJlYWQsICZhZGRyX3NldCwgJnksICZ6KTsKCiAgaWYgKCAoKCh0aHJlYWQgPT0gLTEpIHx8 ICgob3RoZXIpIF4gKHRocmVhZCA9PSBnbG9iYWwpKSkKICAgICAgJiYgKCFhZGRyX3NldCB8fCAo KHkgPiB6KSBeICgoYWRkciA+PSB5KSAmJiAoYWRkciA8PSB6KSkpICkpKQogICAgewogICAgICBM b2NrX2d1YXJkIDxDcHVfbG9jaz4gZ3VhcmQgKCZjcHVfbG9jayk7CgogICAgICBqZGJfdGJ1Zjo6 VGJfZW50cnkgKnRiZSA9IGxvZ191bm1hcF90b19idWYKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA/IGpkYl90YnVmOjpuZXdfZW50cnkoKQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDogKGpkYl90YnVmOjpUYl9lbnRyeSopCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhbGxvY2Eoc2l6ZW9mKGpkYl90YnVmOjpUYl9lbnRyeSkpOwoKICAgICAg dGJlLT5laXAgPSBlZi0+ZWlwOwogICAgICB0YmUtPmN1cnJlbnQgPSB0aGlzOwogICAgICB0YmUt Pm0udW5tYXAuZnBhZ2UgPSByZWdzLT5lYXg7CiAgICAgIHRiZS0+bS51bm1hcC5tYXNrID0gcmVn cy0+ZWN4OwogICAgICB0YmUtPm0udW5tYXAucmVzdWx0ID0gMDsKICAgICAgdGJlLT50eXBlID0g NzsKCgogICAgICBpZiAobG9nX3VubWFwX3RvX2J1ZikKICAgICAgICBqZGJfdGJ1Zjo6Y29tbWl0 X2VudHJ5KCk7CiAgICAgIGVsc2UKICAgICAgICB7CgogICAgICAgICAgUHJvYzo6U3RhdHVzIHMg PSBQcm9jOjpjbGlfc2F2ZSgpOwoKCiAgICAgICAgICBqZGJfdGJ1Zjo6cHJpbnRfZW50cnkodGJl LCBsb2dfbWVzc2FnZSwgc2l6ZW9mKGxvZ19tZXNzYWdlKSk7CiAgICAgICAgICBwcmludGYoIiVz XG4iLCBsb2dfbWVzc2FnZSk7CgoKCiAgICAgICAgICBpbnQgYzsKICAgICAgICAgIHdoaWxlKChj PUtjb25zb2xlOjpjb25zb2xlKCktPmdldGNoYXIoZmFsc2UpKSA9PSAtMSkKICAgICAgICAgICAg UHJvYzo6cGF1c2UoKTsKICAgICAgICAgIGlmKCBjID09ICdpJykKICAgICAgICAgICAgYXNtKCAi aW50CSQzCVxuXHQiICJqbXAJMWYJXG5cdCIgIi5hc2NpaSBcIiIiSVBDIiAiXCIJXG5cdCIgIjE6 CQkJXG5cdCIgIm5vcDtub3A7bm9wCVxuXHQiICk7CgoKICAgICAgICAgIFByb2M6OnN0aV9yZXN0 b3JlKHMpOwoKICAgICAgICB9CiAgICB9CgogIGJvb2wgcmV0ID0gc3lzX2ZwYWdlX3VubWFwKHJl Z3MpOwoKICByZXR1cm4gcmV0Owp9CiMgNDUxICIuLi9zcmMva2Vybi9pYTMyL3RocmVhZC1sb2cu Y3BwIgoKCnZvaWQKVGhyZWFkOjpob29rX3VubWFwX3ZlY3RvcigpCnsKICBzeXNjYWxsX3RhYmxl WzJdID0gJlRocmVhZDo6c3lzX2ZwYWdlX3VubWFwX2xvZzsKfQojIDQ1OCAiLi4vc3JjL2tlcm4v aWEzMi90aHJlYWQtbG9nLmNwcCIKCgp2b2lkClRocmVhZDo6cmVzdG9yZV91bm1hcF92ZWN0b3Io KQp7CiAgc3lzY2FsbF90YWJsZVsyXSA9ICZUaHJlYWQ6OnN5c19mcGFnZV91bm1hcDsKfQo=