This is the mail archive of the gcc-prs@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
>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 <URL:http://www.gnu.org/software/gcc/bugs.html> 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 cGNfZnJhbWU7CmNsYXNzIFNlbmRlcjsKY2xhc3MgVGhyZWFkOwojIDI2ICJhdXRvL3JlY2