submission 27143
KernelBot user 292 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
hipmode.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-27143?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz
Benchmark evidence
18 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
82.4µs
#30 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
82.8µs
#30 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
154.1µs
#40 of 98
2025-05-25
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
165.3µs
#25 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
177.0µs
#29 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
204.1µs
#33 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
354.5µs
#32 of 98
2025-05-25
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
987.0µs
#37 of 98
2025-05-25
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:25a423441e98b1fdbc79c2e5c01e91422742ec980c2ce5342543f53fa1e4f022
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
hipmode.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55OyAgICANCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgIA0KDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047IA0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOyAgDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICB0aWxlQlt0NjR4XVsxMTIgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDExMiArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIHRpbGVCW3Q2NHggKyA2NF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07DQoNCiAgICAgICAgZmxvYXQgdGlsZUFzID0gQXNfcHRyWyhrYmFzZSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgMQ0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTEVGVCBPVkVSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgLy8gbGVmdCBvdmVyIDMyIHJvd3MNCiAgDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyAxMTIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KDQogICAgICAgIC8vIGF1dG8gdHJhbnNwb3NlZF9mcmFnID0gcm9jd21tYTo6YXBwbHlUcmFuc3Bvc2UoZnJhZ19iX2xlZnQpOyAgICAgDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyAxMTIsIGxkYik7ICAgICAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iX2xlZnQsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCg0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIH0vLyBlbmQgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IDEyOCkgDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTSkgcmV0dXJuOyAgICANCiAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCg0KfQ0KDQojZGVmaW5lIEtfSlVNUCAxMjgNCiNkZWZpbmUgV01NQV9NIDMyDQojZGVmaW5lIFdNTUFfTiAzMg0KI2RlZmluZSBXTU1BX0sgMTYNCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA0DQojZGVmaW5lIE9QVElPTiAwDQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBiYWxhbmNlX29sZF9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQV9wdHIsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEJfcHRyLCBjb25zdCBmbG9hdCogQXNfcHRyLCBjb25zdCBmbG9hdCogQnNfcHRyLCByb2N3bW1hOjpiZmxvYXQxNl90KiBDX3B0ciwgaW50IE0sIGludCBOLCBpbnQgSykgew0KICAgIC8qDQogICAgQTogTSB4IEsgY29sLW1haiAgLS0tIEFzICgxeDEyOCBzY2FsaW5nKTogTSB4IEsvMTI4IGNvbC1tYWoNCiAgICBCOiBLIHggTiByb3ctbWFqICAtLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IEsvMTI4IHggTi8xMjggcm93LW1hag0KICAgIEM6IE0geCBOIHJvdy1tYWoNCiAgICBNLCBOIGlzIGRpdmlzaWJsZSBieSA2NCAoc29tZSBhcmUgb25seSBkaXZpc2libGUgYnkgMzIpDQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgMTguNSBLRCBvZiBMRFMNCiAgICAqLw0KICAgIA0KICAgIA0KICAgIA0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVsxMjhdWzcyXTsgLy8gcm93LW1ham9yDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bNzJdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBpbnQgbGRhID0gNzI7DQogICAgaW50IGxkYiA9IDcyOw0KICAgIF9fc2hhcmVkX18gZmxvYXQgdGlsZUFzWzEyOF07DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIC8vIGludCBsZGEgPSBNOw0KICAgIC8vIGludCBsZGIgPSBOOw0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQogICAgDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KDQogICAgICAgIC8vIExvYWQgU01FTTogdGlsZUEsIHRpbGVCLCB0aWxlQXMsIHRpbGVCcw0KICAgICAgICAvLyBUUlk6IHRlc3QgdGlsZWQgcGFydGl0aW9uIDY0ICAgDQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklSU1QgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaV9sb2FkID0gMDsga21pbmlfbG9hZCA8IDY0OyBrbWluaV9sb2FkICs9IDE2KXsgIC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCiAgICAgICAgDQogICAgICAgIGludCB0MTI4eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDEyODsNCiAgICAgICAgaW50IHQxMjh5ID0gdGhpc190Yi50aHJlYWRfcmFuaygpIC8gMTI4OyANCg0KICAgICAgICBpZiAodDEyOHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIHRpbGVBc1t0MTI4eF0gPSBBc19wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0MTI4eCArIE0gKiAoa2Jhc2UgLyAxMjgpXSAqIHRpbGVCczsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRUNPTkQgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCA2NDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KICAgICAgICAvLyBBcHBseSBzY2FsZXINCg0KDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBpbnQgcGxhY2UgPSB3YXJwX2lkeF95ICogV01NQV9NICsgNCAqICh0NjR4IC8gMzIpOzsNCg0KICAgICAgICAvLyBpID0gMA0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFswXSAgKz0gdGlsZUFzW3BsYWNlICsgMF0gICogZnJhZ19hY2NfYmxvY2sueFswXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMV0gICs9IHRpbGVBc1twbGFjZSArIDFdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzJdICArPSB0aWxlQXNbcGxhY2UgKyAyXSAgKiBmcmFnX2FjY19ibG9jay54WzJdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFszXSAgKz0gdGlsZUFzW3BsYWNlICsgM10gICogZnJhZ19hY2NfYmxvY2sueFszXTsNCg0KICAgICAgICAvLyBpID0gMQ0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs0XSAgKz0gdGlsZUFzW3BsYWNlICsgOF0gICogZnJhZ19hY2NfYmxvY2sueFs0XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNV0gICs9IHRpbGVBc1twbGFjZSArIDldICAqIGZyYWdfYWNjX2Jsb2NrLnhbNV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzZdICArPSB0aWxlQXNbcGxhY2UgKyAxMF0gKiBmcmFnX2FjY19ibG9jay54WzZdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs3XSAgKz0gdGlsZUFzW3BsYWNlICsgMTFdICogZnJhZ19hY2NfYmxvY2sueFs3XTsNCg0KICAgICAgICAvLyBpID0gMg0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs4XSAgKz0gdGlsZUFzW3BsYWNlICsgMTZdICogZnJhZ19hY2NfYmxvY2sueFs4XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOV0gICs9IHRpbGVBc1twbGFjZSArIDE3XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEwXSArPSB0aWxlQXNbcGxhY2UgKyAxOF0gKiBmcmFnX2FjY19ibG9jay54WzEwXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTFdICs9IHRpbGVBc1twbGFjZSArIDE5XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTFdOw0KDQogICAgICAgIC8vIGkgPSAzDQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEyXSArPSB0aWxlQXNbcGxhY2UgKyAyNF0gKiBmcmFnX2FjY19ibG9jay54WzEyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTNdICs9IHRpbGVBc1twbGFjZSArIDI1XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTNdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNF0gKz0gdGlsZUFzW3BsYWNlICsgMjZdICogZnJhZ19hY2NfYmxvY2sueFsxNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzE1XSArPSB0aWxlQXNbcGxhY2UgKyAyN10gKiBmcmFnX2FjY19ibG9jay54WzE1XTsNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICBpZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICAvL2ludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIC8vaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsgIA0KDQogICAgLy9pbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIC8vaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzI1Nl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVsyNTZdOyAvLyByb3ctbWFqDQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIA0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICAgICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCg0KICAgICAgICBpbnQgdDY0eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDY0Ow0KICAgICAgICBpbnQgdDY0eSA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAvIDY0Ow0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDQNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCg0KICAgICAgICAgICAgdGlsZUJbdDY0eF1bS19pZHhfc2hpZnR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsgICANCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdWzEyOCArIEtfaWR4X3NoaWZ0eV0gPSBCX3B0clsoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0gICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW0tfaWR4X3NoaWZ0eV0gPSBBX3B0cltibG9ja0lkeC54ICogV01NQV9NICogTlVNX1dBUlBfWCArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07ICAgICAgIA0KICAgICAgIA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1bMTI4ICsgS19pZHhfc2hpZnR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIA0KICAgICAgICB9IA0KDQogICAgICAgIGZsb2F0IHRpbGVBczEgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCczEgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMSA9IHRpbGVBczEgKiB0aWxlQnMxOw0KICAgICAgICBmbG9hdCB0aWxlQXMyID0gQXNfcHRyWygxICsga2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzMiA9IEJzX3B0clsoMSArIGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMiA9IHRpbGVBczIgKiB0aWxlQnMyOw0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgDQogICAgICAgIC8vIF9fdGhyZWFkZmVuY2VfYmxvY2soKTsNCiAgICAgICAgLy8gTUZNQQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgMTI4OyBrbWluaSArPSBXTU1BX0spew0KICAgICAgICAgICAgaW50IHRpbGVCX3JvdyA9IHdhcnBfaWR4X3kgKiBXTU1BX00gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICBpbnQgS19pZHhfYmFzZSA9IGttaW5pICsgKHQ2NHggLyAxNikgKiA4Ow0KICAgICAgICAgICAgaW50IEtfaWR4X3NoaWZ0eUIgPSAoS19pZHhfYmFzZSArIDggKiB0aWxlQl9yb3cpICUgMTI4Ow0KICAgICAgICAgICAgLy8gbWVtY3B5KCZmcmFnX2EueFswXSwgJnRpbGVCW3RpbGVCX3Jvd11bS19pZHhfc2hpZnR5Ql0sIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbMF1bMF0gKyB0aWxlQl9yb3cgKiAyNTYgKyBLX2lkeF9zaGlmdHlCLCBzaXplb2YobG9uZykpOyANCg0KICAgICAgICAgICAgaW50IHRpbGVBX2NvbCA9IHdhcnBfaWR4X3ggKiBXTU1BX04gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICAvLyBpbnQgS19pZHhfc2hpZnR5QSA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVBX2NvbCkgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYi54WzBdLCAmdGlsZUFbdGlsZUFfY29sXVtLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVswXVswXSArIHRpbGVBX2NvbCAqIDI1NiArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTEsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIA0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrMiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2syLCAwLmYpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSyl7DQogICAgICAgICAgICBpbnQgdGlsZUJfcm93ID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIGludCBLX2lkeF9iYXNlID0ga21pbmkgKyAodDY0eCAvIDE2KSAqIDg7DQogICAgICAgICAgICBpbnQgS19pZHhfc2hpZnR5QiA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVCX3JvdykgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbdGlsZUJfcm93XVsxMjggKyBLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19hLnhbMF0sICZ0aWxlQlswXVswXSArIHRpbGVCX3JvdyAqIDI1NiArIDEyOCArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7IA0KDQogICAgICAgICAgICBpbnQgdGlsZUFfY29sID0gd2FycF9pZHhfeCAqIFdNTUFfTiArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIC8vIGludCBLX2lkeF9zaGlmdHlBID0gKEtfaWR4X2Jhc2UgKyA4ICogdGlsZUFfY29sKSAlIDEyODsNCiAgICAgICAgICAgIC8vIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVt0aWxlQV9jb2xdWzEyOCArIEtfaWR4X3NoaWZ0eUJdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2IueFswXSwgJnRpbGVBWzBdWzBdICsgdGlsZUFfY29sICogMjU2ICsgMTI4ICsgS19pZHhfc2hpZnR5Qiwgc2l6ZW9mKGxvbmcpKTsNCg0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2syLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2syKTsNCiAgICAgICAgfSANCg0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTIsIGZyYWdfYWNjX2Jsb2NrMi54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47IA0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0KY29uc3RleHByIGludCBLX1ZBTFVFID0gNzE2ODsNCmNvbnN0ZXhwciBpbnQgTV9WQUxVRSA9IDYxNDQ7DQpjb25zdGV4cHIgaW50IE5fVkFMVUUgPSA0NjA4Ow0KY29uc3RleHByIGludCBOX1ZBTFVFMiA9IDE1MzY7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgKE4gPT0gTl9WQUxVRSB8fCBOID09IE5fVkFMVUUyKSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IFRIUkVTSE9MRCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgfQ0KDQogICAgZWxzZSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2VfbmV3X2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOyAgICANCiAgICB9DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQoNCiMgYmlnIG9uZSwgdXNlZCB3aGVuIE4gaXMgPj0gMzA3Mg0KbW9kdWxlX2JpZyA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sICAgIA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQ0KICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpIA0KICAgIHJldHVybiBjDQo=Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 24658.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUJbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmkgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOyAgICAgICAgICAgIA0KICAgICAgICB9DQoNCiAgICAgICAgdGlsZUJbdDY0eF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICB0aWxlQlt0NjR4ICsgNjRdWzExMiArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMTEyICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjRdOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsgICAgDQogICAgICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDE2OyBrbWluaSArPSBXTU1BX0spIHsNCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iLCAmdGlsZUFbMF1bMF0gKyBrbWluaSArIGxkYSAqICh3YXJwX2lkeF94ICogV01NQV9OKSwgbGRhKTsNCiAgICAgICAgICAgIHJvY3dtbWE6Om1tYV9zeW5jKGZyYWdfYWNjX2Jsb2NrLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExFRlQgT1ZFUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIC8vIGxlZnQgb3ZlciAzMiByb3dzDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047ICAgDQoNCiAgICAgICAgYXV0byBmcmFnX2JfbGVmdCA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7IA0KICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYl9sZWZ0LCBBX3B0ciArIChrYmFzZSArIDExMikgKiBNICsgY29sX2Jhc2VfQywgTSk7ICAgICANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIDExMiwgbGRiKTsgICAgICAgICAgICANCg0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007ICANCg0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gX19zeW5jdGhyZWFkcygpOw0KICAgICAgICAvLyBNdWx0IHNjYWxlcnMNCg0KICAgICAgICAvLyBUT0RPOiB1c2UgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50cyBvciA0IHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHM7ICsraSl7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSArPSB0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldICogdGlsZUJzOw0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIHRpbGVCcywgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbaV0gPSBmbWFmKHNjYWxlLCBmcmFnX2FjY19ibG9jay54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KICAgIA0KICAgIC8vIENvbnZlcnQgZnAzMiB0byBiZjE2IGFuZCBzdG9yZQ0KICAgIC8vIFRPRE86IGNoYW5nZSBXTU1BX1BMQUNFSE9MREVSIGZyb20gOCB0byAxNg0KICAgIGF1dG8gZnJhZ19yZXN1bHQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfUExBQ0VIT0xERVIsIHJvY3dtbWE6OmJmbG9hdDE2X3Q+KCk7IC8vUGxhY2Vob2xkZXIgZnJhZw0KICAgIA0KICAgICNwcmFnbWEgdW5yb2xsDQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpIHsNCiAgICAgICAgZnJhZ19yZXN1bHQueFtpXSA9IChyb2N3bW1hOjpiZmxvYXQxNl90KWZyYWdfYWNjX21hc3Rlci54W2ldOw0KICAgIH0NCiAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKyBOICogY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9jb2xfbWFqb3IpOw0KDQp9DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCiNkZWZpbmUgT1BUSU9OIDANCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2Vfb2xkX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBBOiBNIHggSyBjb2wtbWFqICAtLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBNIHggSy8xMjggY29sLW1hag0KICAgIEI6IEsgeCBOIHJvdy1tYWogIC0tLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogSy8xMjggeCBOLzEyOCByb3ctbWFqDQogICAgQzogTSB4IE4gcm93LW1hag0KICAgIE0sIE4gaXMgZGl2aXNpYmxlIGJ5IDY0IChzb21lIGFyZSBvbmx5IGRpdmlzaWJsZSBieSAzMikNCiAgICBLIGlzIGRpdmlzaWJsZSBieSAxMjgNCiAgICAxOC41IEtEIG9mIExEUw0KICAgICovDQogICAgDQogICAgDQogICAgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVBWzEyOF1bNzJdOyAvLyByb3ctbWFqb3INCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbMTI4XVs3Ml07IC8vIGNvbC1tYWpvciwgPSByb3ctbWFqb3IgdHJhbnNwb3NlZA0KICAgIGludCBsZGEgPSA3MjsNCiAgICBpbnQgbGRiID0gNzI7DQogICAgX19zaGFyZWRfXyBmbG9hdCB0aWxlQXNbMTI4XTsNCg0KICAgIGF1dG8gZnJhZ19hY2NfbWFzdGVyID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpOw0KICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfbWFzdGVyLCAwLmYpOw0KDQogICAgLy8gaW50IGxkYSA9IE07DQogICAgLy8gaW50IGxkYiA9IE47DQogICAgY2c6OnRocmVhZF9ibG9jayB0aGlzX3RiID0gY2c6OnRoaXNfdGhyZWFkX2Jsb2NrKCk7DQogICAgYXV0byBncm91cDY0ID0gY2c6OnRpbGVkX3BhcnRpdGlvbjw2ND4odGhpc190Yik7IC8vIDEwMjQgdGhyZWFkcyAtPiA2NCB4IDE2DQogICAgaW50IHQ2NHggPSBncm91cDY0LnRocmVhZF9yYW5rKCk7DQogICAgaW50IHQ2NHkgPSBncm91cDY0Lm1ldGFfZ3JvdXBfcmFuaygpOyANCiAgICANCiAgICBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gS19KVU1QKSB7DQoNCiAgICAgICAgLy8gTG9hZCBTTUVNOiB0aWxlQSwgdGlsZUIsIHRpbGVBcywgdGlsZUJzDQogICAgICAgIC8vIFRSWTogdGVzdCB0aWxlZCBwYXJ0aXRpb24gNjQgICANCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSVJTVCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pX2xvYWQgPSAwOyBrbWluaV9sb2FkIDwgNjQ7IGttaW5pX2xvYWQgKz0gMTYpeyAgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBBX3B0cltibG9ja0lkeC55ICogV01NQV9NICogTlVNX1dBUlBfWSArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVBW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC54ICogV01NQV9OICogTlVNX1dBUlBfWCArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjRdOw0KICAgICAgICB9IC8vIGVuZCBmb3Iga21pbmlfbG9hZCA8IEtfSlVNUA0KICAgICAgICANCiAgICAgICAgaWYgKHQ2NHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIGZsb2F0MiB2YWwgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Mio+KEFzX3B0ciArIGJsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgTSAqIChrYmFzZSAvIDEyOCkpW3Q2NHhdOw0KICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdDIqPih0aWxlQXMpW3Q2NHhdID0gbWFrZV9mbG9hdDIodmFsLnggKiB0aWxlQnMsIHZhbC55ICogdGlsZUJzKTsNCiAgICAgICAgfSAgICAgICANCg0KICAgICAgICAvLyBpZiAodDY0eSA9PSAwKSB7DQogICAgICAgIC8vICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKCgoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgLy8gICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQyKj4odGlsZUFzKVt0NjR4XSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQyKj4oQXNfcHRyICsgYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyBNICogKGtiYXNlIC8gMTI4KSlbdDY0eF0gKiB0aWxlQnM7DQogICAgICAgIC8vIH0NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRUNPTkQgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCA2NDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KICAgICAgICAvLyBBcHBseSBzY2FsZXINCg0KDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBpbnQgcGxhY2UgPSB3YXJwX2lkeF95ICogV01NQV9NICsgNCAqICh0NjR4IC8gMzIpOzsNCg0KICAgICAgICAvLyBpID0gMA0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFswXSAgKz0gdGlsZUFzW3BsYWNlICsgMF0gICogZnJhZ19hY2NfYmxvY2sueFswXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMV0gICs9IHRpbGVBc1twbGFjZSArIDFdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzJdICArPSB0aWxlQXNbcGxhY2UgKyAyXSAgKiBmcmFnX2FjY19ibG9jay54WzJdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFszXSAgKz0gdGlsZUFzW3BsYWNlICsgM10gICogZnJhZ19hY2NfYmxvY2sueFszXTsNCg0KICAgICAgICAvLyBpID0gMQ0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs0XSAgKz0gdGlsZUFzW3BsYWNlICsgOF0gICogZnJhZ19hY2NfYmxvY2sueFs0XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNV0gICs9IHRpbGVBc1twbGFjZSArIDldICAqIGZyYWdfYWNjX2Jsb2NrLnhbNV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzZdICArPSB0aWxlQXNbcGxhY2UgKyAxMF0gKiBmcmFnX2FjY19ibG9jay54WzZdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs3XSAgKz0gdGlsZUFzW3BsYWNlICsgMTFdICogZnJhZ19hY2NfYmxvY2sueFs3XTsNCg0KICAgICAgICAvLyBpID0gMg0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs4XSAgKz0gdGlsZUFzW3BsYWNlICsgMTZdICogZnJhZ19hY2NfYmxvY2sueFs4XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOV0gICs9IHRpbGVBc1twbGFjZSArIDE3XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEwXSArPSB0aWxlQXNbcGxhY2UgKyAxOF0gKiBmcmFnX2FjY19ibG9jay54WzEwXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTFdICs9IHRpbGVBc1twbGFjZSArIDE5XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTFdOw0KDQogICAgICAgIC8vIGkgPSAzDQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEyXSArPSB0aWxlQXNbcGxhY2UgKyAyNF0gKiBmcmFnX2FjY19ibG9jay54WzEyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTNdICs9IHRpbGVBc1twbGFjZSArIDI1XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTNdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNF0gKz0gdGlsZUFzW3BsYWNlICsgMjZdICogZnJhZ19hY2NfYmxvY2sueFsxNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzE1XSArPSB0aWxlQXNbcGxhY2UgKyAyN10gKiBmcmFnX2FjY19ibG9jay54WzE1XTsNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIC8vaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgLy9pbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KICAgIC8vaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIC8vaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAvL2ludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgLy9pZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOyAgDQoNCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgICANCiAgICByb2N3bW1hOjpzdG9yZV9tYXRyaXhfc3luYyhDX3B0ciArIHJvd19iYXNlX0MgKiBOICsgY29sX2Jhc2VfQywgZnJhZ19yZXN1bHQsIE4sIHJvY3dtbWE6Om1lbV9yb3dfbWFqb3IpOw0KfQ0KDQojZGVmaW5lIEtfSlVNUCAyNTYNCiNkZWZpbmUgV01NQV9NIDE2DQojZGVmaW5lIFdNTUFfTiAxNg0KI2RlZmluZSBXTU1BX0sgMzINCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA4DQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBrX2xhcmdlX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBQZXJmb3JtIEIgQCBBLlQgPSBDLlQsIHNvIHdlIGNhbiBzdG9yZSBzY2FsZSBBcyBpbiBhIFZHUFIgb2YgZWFjaCB0aHJlYWQgaW4gYSB3YXJwDQogICAgQjogTnhLIGNvbC1tYWogLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IE4vMTI4IHggSy8xMjggY29sLW1hag0KICAgIEEuVDogS3hNIHJvdy1tYWogLS0gQXMgKDF4MTI4IHNjYWxpbmcpOiBLLyAxMjggeCBNIHJvdy1tYWoNCiAgICBDLlQ6IE54TSBjb2wtbWFqDQogICAgTSwgTiBhcmUgZGl2aXNpYmxlIGJ5IDY0LCBLIGlzIGRpdmlzaWJsZSBieSAyNTYNCg0KICAgIFNNRU0gd2l0aCBwYWRkaW5nIHBlciBibG9jazoNCiAgICA2NCAqICgyNTYgKyA4KSAvIDEwMjQgKyA2NCAqICgyMjQgKyA4KSAvIDEwMjQgPSAxNi41ICsgMTQuNSA9IDMxIEtCIHBlciBibG9jaw0KDQogICAgKi8NCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KICAgIC8vIGludCBzbiA9IE4gLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUJbNjRdWzI2NF07IC8vIHJvdy1tYWoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzIzMl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgaW50IGxkYiA9IDI2NDsNCiAgICBpbnQgbGRhID0gMjMyOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KIA0KICAgICAgICAvLyBMb2FkIHRpbGVzDQogICAgICAgIC8vIFRPRE86IHJlcGxhY2UgKz0gMTYgd2l0aCArPSBncm91cDY0Lm1ldGFfZ3JvdXBfc2l6ZSgpDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IEtfSlVNUCAtIDMyOyBrbWluaSArPSAxNil7IC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmkgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHRpbGVCW3Q2NHhdWzIyNCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsgMjI0ICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsNCiAgICAgICAgdGlsZUJbdDY0eF1bMjQwICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAyNDAgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOyANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJUlNUIEhBTEYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgICAgICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICANCg0KICAgICAgICAjcHJhZ21hIHVucm9sbCAxDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007IA0KICAgICAgICBpbnQgY29sX2Jhc2VfQyA9IChibG9ja0lkeC54ICogTlVNX1dBUlBfWCArIHdhcnBfaWR4X3gpICogV01NQV9OOw0KDQogICAgICAgIC8vIE11bHQgc2NhbGVycw0KICAgICAgICBmbG9hdCB0aWxlQXMgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCcyA9IEJzX3B0clsoa2Jhc2UgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgZmxvYXQgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgICAgIA0KICAgIA0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNFQ09ORCBIQUxGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAxMjg7IGttaW5pIDwgS19KVU1QIC0gMzI7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyBrbWluaSwgbGRiKTsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICByb2N3bW1hOjpsb2FkX21hdHJpeF9zeW5jKGZyYWdfYiwgJnRpbGVBWzBdWzBdICsga21pbmkgKyBsZGEgKiAod2FycF9pZHhfeCAqIFdNTUFfTiksIGxkYSk7DQogICAgICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfSAgDQoNCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIEtfSlVNUCAtIDMyLCBsZGIpOyAgICAgICAgDQogICAgICAgIA0KICAgICAgICAvLyBsZWZ0IG92ZXIgMzIgcm93cw0KICAgICAgICBhdXRvIGZyYWdfYl9sZWZ0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsgICAgICAgIA0KDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19iX2xlZnQsIEFfcHRyICsgKGtiYXNlICsgS19KVU1QIC0gMzIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2JfbGVmdCwgZnJhZ19hY2NfYmxvY2spOw0KDQogICAgICAgIHRpbGVBcyA9IEFzX3B0clsoKGtiYXNlICsgMTI4KSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICB0aWxlQnMgPSBCc19wdHJbKChrYmFzZSArIDEyOCkgLyAxMjgpICogc24gKyByb3dfYmFzZV9DIC8gMTI4XTsNCiAgICAgICAgc2NhbGUgPSB0aWxlQXMgKiB0aWxlQnM7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgLy8gVE9ETzogcHJhZ21hIHVucm9sbCA0IGxlYWRzIHRvIHJlZ2lzdGVyIHNwaWxsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKXsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldICs9IHRpbGVBcyAqIGZyYWdfYWNjX2Jsb2NrLnhbaV0gKiB0aWxlQnM7DQogICAgICAgICAgICAvLyBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYodGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSwgdGlsZUJzLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7DQogICAgICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFtpXSA9IGZtYWYoc2NhbGUsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgfSANCiAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCg0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47ICAgIA0KDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoTSA9PSA5NiB8fCBNID09IDY0KXsNCiAgICAgICAgZGltMyBncmlkX3NpemUoKE0gKyBudW1fd2FycF94ICogMTYgLSAxKSAvIChudW1fd2FycF94ICogMTYpLCANCiAgICAgICAgICAgICAgICAgICAgKE4gKyBudW1fd2FycF95ICogMTYgLSAxKSAvIChudW1fd2FycF95ICogMTYpKTsNCiAgICAgICAga19sYXJnZV9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsgICAgDQogICAgfQ0KDQogICAgaWYgKEsgIT0gNzE2OCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBpZiAoTSA9PSA2MTQ0ICYmIChOID09IDQ2MDggfHwgTiA9PSAxNTM2KSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IDU4OTgyNCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgfQ0KDQogICAgZWxzZSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2VfbmV3X2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOyAgICANCiAgICB9DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQoNCiMgYmlnIG9uZSwgdXNlZCB3aGVuIE4gaXMgPj0gMzA3Mg0KbW9kdWxlX2JpZyA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sICAgIA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQ0KICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpIA0KICAgIHJldHVybiBjDQo=No newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0NCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUNCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QNCmltcG9ydCBzeXMNCg0KaW1wb3J0IG9zDQppZiAiUFlUT1JDSF9ST0NNX0FSQ0giIG5vdCBpbiBvcy5lbnZpcm9uOg0KICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSINCg0KQ1BQX1dSQVBQRVIgPSAiIiINCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpOw0KIiIiDQoNCkNVREFfU1JDID0gIiIiDQojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+DQojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4NCiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4NCiNpbmNsdWRlIDxoaXAvaGlwX2Nvb3BlcmF0aXZlX2dyb3Vwcy5oPg0KI2luY2x1ZGUgPHJvY3dtbWEvcm9jd21tYS5ocHA+DQpuYW1lc3BhY2UgY2cgPSBjb29wZXJhdGl2ZV9ncm91cHM7DQoNCiNkZWZpbmUgS19KVU1QIDEyOA0KI2RlZmluZSBXTU1BX00gMzINCiNkZWZpbmUgV01NQV9OIDMyDQojZGVmaW5lIFdNTUFfSyAxNg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDQNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGJhbGFuY2VfbmV3X2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBBX3B0ciwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQl9wdHIsIGNvbnN0IGZsb2F0KiBBc19wdHIsIGNvbnN0IGZsb2F0KiBCc19wdHIsIHJvY3dtbWE6OmJmbG9hdDE2X3QqIENfcHRyLCBpbnQgTSwgaW50IE4sIGludCBLKSB7DQogICAgLyoNCiAgICBhIGJsb2NrIGNvdmVycyAzMngzMiBlbGVtDQogICAgZGltMyBibG9ja19zaXplKDY0LCAxKSAtPiAxIHRocmVhZCBjYWxjdWxhdGVzIDE2IGVsZW0NCg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICANCiAgICBNLCBOLCBLIGFyZSBkaXZpc2libGUgYnkgMTI4DQoNCiAgICBLZXJuZWwgdG8gdXNlIHdoZW4gTSwgTiBpcyBiYWxhbmNlZA0KICAgIFVzZSB3bW1hIDMyeDMyeDE2DQoNCiAgICB0aWxlQlsxMjhdWzEyOF0NCiAgICB0aWxlQVsxMjhdWzExMl0NCg0KICAgIFNNRU0gdXNhZ2UgcGVyIGJsb2NrOiAzMktCDQoNCiAgICAqLyAgDQoNCiAgICBpbnQgc24gPSAoTiArIDEyOCAtIDEpIC8gMTI4Ow0KDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bMTM2XTsgLy8gY29sLW1haiA9IHJvdy1tYWogdHJhbnNwb3NlZCANCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbMTI4XVsxMjBdOyAvLyByb3ctbWFqDQogICAgaW50IGxkYiA9IDEzNjsNCiAgICBpbnQgbGRhID0gMTIwOw0KDQogICAgYXV0byBmcmFnX2FjY19tYXN0ZXIgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCk7DQogICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19tYXN0ZXIsIDAuZik7DQoNCiAgICBjZzo6dGhyZWFkX2Jsb2NrIHRoaXNfdGIgPSBjZzo6dGhpc190aHJlYWRfYmxvY2soKTsNCiAgICBhdXRvIGdyb3VwNjQgPSBjZzo6dGlsZWRfcGFydGl0aW9uPDY0Pih0aGlzX3RiKTsgLy8gMTAyNCB0aHJlYWRzIC0+IDY0IHggMTYNCiAgICBpbnQgdDY0eCA9IGdyb3VwNjQudGhyZWFkX3JhbmsoKTsNCiAgICBpbnQgdDY0eSA9IGdyb3VwNjQubWV0YV9ncm91cF9yYW5rKCk7IA0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55OyAgICANCiAgICAgICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgIA0KDQogICAgICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047IA0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOyAgDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiAgICAgICAgLy8gVE9ETzogcmVwbGFjZSArPSAxNiB3aXRoICs9IGdyb3VwNjQubWV0YV9ncm91cF9zaXplKCkNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IDE2KXsgLy8gMTYgaXMgbnVtIGdyb3VwDQogICAgICAgICAgICB0aWxlQVt0NjR4XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pICsgdDY0eSldOw0KICAgICAgICAgICAgdGlsZUFbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueCAqIFdNTUFfTSAqIE5VTV9XQVJQX1ggKyB0NjR4ICsgNjQgKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHhdOw0KICAgICAgICAgICAgdGlsZUJbdDY0eCArIDY0XVtrbWluaSArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmkgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KICAgICAgICB0aWxlQlt0NjR4XVsxMTIgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIDExMiArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIHRpbGVCW3Q2NHggKyA2NF1bMTEyICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyAxMTIgKyB0NjR5KSAqIE4gKyBibG9ja0lkeC55ICogV01NQV9OICogTlVNX1dBUlBfWSArIHQ2NHggKyA2NF07DQoNCiAgICAgICAgZmxvYXQgdGlsZUFzID0gQXNfcHRyWyhrYmFzZSAvIDEyOCkgKiBNICsgY29sX2Jhc2VfQyArIHQ2NHggJSBXTU1BX05dOw0KICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOw0KDQogICAgICAgIC8vIGZsb2F0IHNjYWxlID0gdGlsZUFzICogdGlsZUJzOyAvLyB0aGlzIGdpdmVzIGxhcmdlIGVycm9yLCBkdWUgdG8gbm9uLWFzc29jaWF0aXZlIG9mIElFRUUgNzU0ID8NCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQogICAgICAgIC8vIE1GTUENCg0KICAgICAgICAvLyBNRk1BIG9uIFNNRU0NCiAgICAgICAgYXV0byBmcmFnX2FjY19ibG9jayA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2ssIDAuZik7DQoNCiAgICAgICAgYXV0byBmcmFnX2EgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYSwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOw0KICAgICAgICBhdXRvIGZyYWdfYiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9iLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpjb2xfbWFqb3I+KCk7DQoNCiAgDQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwgMQ0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgS19KVU1QIC0gMTY7IGttaW5pICs9IFdNTUFfSykgew0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQlswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYiArIGttaW5pLCBsZGIpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQVswXVswXSArIGttaW5pICsgbGRhICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGEpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTEVGVCBPVkVSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgLy8gbGVmdCBvdmVyIDMyIHJvd3MNCiAgDQogICAgICAgIGF1dG8gZnJhZ19iX2xlZnQgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6cm93X21ham9yPigpOyANCiAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2JfbGVmdCwgQV9wdHIgKyAoa2Jhc2UgKyAxMTIpICogTSArIGNvbF9iYXNlX0MsIE0pOw0KDQogICAgICAgIC8vIGF1dG8gdHJhbnNwb3NlZF9mcmFnID0gcm9jd21tYTo6YXBwbHlUcmFuc3Bvc2UoZnJhZ19iX2xlZnQpOyAgICAgDQogICAgICAgIHJvY3dtbWE6OmxvYWRfbWF0cml4X3N5bmMoZnJhZ19hLCAmdGlsZUJbMF1bMF0gKyAod2FycF9pZHhfeSAqIFdNTUFfTSkgKiBsZGIgKyAxMTIsIGxkYik7ICAgICAgICAgICAgDQoNCiAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iX2xlZnQsIGZyYWdfYWNjX2Jsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCg0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQoNCiAgICAgICAgLy8gVE9ETzogdXNlIGZyYWdfYWNjX21hc3Rlci5udW1fZWxlbWVudHMgb3IgNCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnX2FjY19tYXN0ZXIubnVtX2VsZW1lbnRzOyArK2kpew0KICAgICAgICAgICAgLy8gZnJhZ19hY2NfbWFzdGVyLnhbaV0gKz0gdGlsZUFzICogZnJhZ19hY2NfYmxvY2sueFtpXSAqIHRpbGVCczsNCiAgICAgICAgICAgIC8vIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZih0aWxlQXMgKiBmcmFnX2FjY19ibG9jay54W2ldLCB0aWxlQnMsIGZyYWdfYWNjX21hc3Rlci54W2ldKTsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZSwgZnJhZ19hY2NfYmxvY2sueFtpXSwgZnJhZ19hY2NfbWFzdGVyLnhbaV0pOw0KICAgICAgICB9DQogICAgDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgIH0vLyBlbmQgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IDEyOCkgDQogICAgaW50IHdhcnBfaWR4X3kgPSB0aHJlYWRJZHgueTsNCiAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIGlmIChyb3dfYmFzZV9DID49IE4pIHJldHVybjsNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTSkgcmV0dXJuOyAgICANCiAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCg0KfQ0KDQojZGVmaW5lIEtfSlVNUCAxMjgNCiNkZWZpbmUgV01NQV9NIDMyDQojZGVmaW5lIFdNTUFfTiAzMg0KI2RlZmluZSBXTU1BX0sgMTYNCiNkZWZpbmUgTlVNX1dBUlBfWCA0DQojZGVmaW5lIE5VTV9XQVJQX1kgNA0KI2RlZmluZSBXQVJQX1NJWkUgNjQNCiNkZWZpbmUgV01NQV9QTEFDRUhPTERFUiA0DQojZGVmaW5lIE9QVElPTiAwDQoNCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXygxMDI0LCA4KSBiYWxhbmNlX29sZF9rZXJuZWwoY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiogQV9wdHIsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEJfcHRyLCBjb25zdCBmbG9hdCogQXNfcHRyLCBjb25zdCBmbG9hdCogQnNfcHRyLCByb2N3bW1hOjpiZmxvYXQxNl90KiBDX3B0ciwgaW50IE0sIGludCBOLCBpbnQgSykgew0KICAgIC8qDQogICAgQTogTSB4IEsgY29sLW1haiAgLS0tIEFzICgxeDEyOCBzY2FsaW5nKTogTSB4IEsvMTI4IGNvbC1tYWoNCiAgICBCOiBLIHggTiByb3ctbWFqICAtLS0gQnMgKDEyOHgxMjggc2NhbGluZyk6IEsvMTI4IHggTi8xMjggcm93LW1hag0KICAgIEM6IE0geCBOIHJvdy1tYWoNCiAgICBNLCBOIGlzIGRpdmlzaWJsZSBieSA2NCAoc29tZSBhcmUgb25seSBkaXZpc2libGUgYnkgMzIpDQogICAgSyBpcyBkaXZpc2libGUgYnkgMTI4DQogICAgMTguNSBLRCBvZiBMRFMNCiAgICAqLw0KICAgIA0KICAgIA0KICAgIA0KICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiB0aWxlQVsxMjhdWzcyXTsgLy8gcm93LW1ham9yDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzEyOF1bNzJdOyAvLyBjb2wtbWFqb3IsID0gcm93LW1ham9yIHRyYW5zcG9zZWQNCiAgICBpbnQgbGRhID0gNzI7DQogICAgaW50IGxkYiA9IDcyOw0KICAgIF9fc2hhcmVkX18gZmxvYXQgdGlsZUFzWzEyOF07DQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIC8vIGludCBsZGEgPSBNOw0KICAgIC8vIGludCBsZGIgPSBOOw0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KICAgIGF1dG8gZ3JvdXA2NCA9IGNnOjp0aWxlZF9wYXJ0aXRpb248NjQ+KHRoaXNfdGIpOyAvLyAxMDI0IHRocmVhZHMgLT4gNjQgeCAxNg0KICAgIGludCB0NjR4ID0gZ3JvdXA2NC50aHJlYWRfcmFuaygpOw0KICAgIGludCB0NjR5ID0gZ3JvdXA2NC5tZXRhX2dyb3VwX3JhbmsoKTsgDQogICAgDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KDQogICAgICAgIC8vIExvYWQgU01FTTogdGlsZUEsIHRpbGVCLCB0aWxlQXMsIHRpbGVCcw0KICAgICAgICAvLyBUUlk6IHRlc3QgdGlsZWQgcGFydGl0aW9uIDY0ICAgDQoNCiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklSU1QgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaV9sb2FkID0gMDsga21pbmlfbG9hZCA8IDY0OyBrbWluaV9sb2FkICs9IDE2KXsgIC8vIDE2IGlzIG51bSBncm91cA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1ba21pbmlfbG9hZCArIHQ2NHldID0gQV9wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0NjR4ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQlt0NjR4XVtrbWluaV9sb2FkICsgdDY0eV0gPSBCX3B0clsoa2Jhc2UgKyBrbWluaV9sb2FkICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueCAqIFdNTUFfTiAqIE5VTV9XQVJQX1ggKyB0NjR4XTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHggKyA2NF1ba21pbmlfbG9hZCArIHQ2NHldID0gQl9wdHJbKGtiYXNlICsga21pbmlfbG9hZCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCiAgICAgICAgDQogICAgICAgIGludCB0MTI4eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDEyODsNCiAgICAgICAgaW50IHQxMjh5ID0gdGhpc190Yi50aHJlYWRfcmFuaygpIC8gMTI4OyANCg0KICAgICAgICBpZiAodDEyOHkgPT0gMCkgew0KICAgICAgICAgICAgaW50IHNuID0gKE4gKyAxMjggLSAxKSAvIDEyODsgICAgDQogICAgICAgICAgICBmbG9hdCB0aWxlQnMgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKChibG9ja0lkeC54ICogTlVNX1dBUlBfWCAqIFdNTUFfTikgLyAxMjgpXTsNCiAgICAgICAgICAgIHRpbGVBc1t0MTI4eF0gPSBBc19wdHJbYmxvY2tJZHgueSAqIFdNTUFfTSAqIE5VTV9XQVJQX1kgKyB0MTI4eCArIE0gKiAoa2Jhc2UgLyAxMjgpXSAqIHRpbGVCczsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgX19zeW5jdGhyZWFkcygpOw0KDQoNCiAgICAgICAgLy8gTUZNQSBvbiBTTUVNDQogICAgICAgIGF1dG8gZnJhZ19hY2NfYmxvY2sgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjphY2N1bXVsYXRvciwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgZmxvYXQ+KCkgOw0KICAgICAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX2Jsb2NrLCAwLmYpOw0KDQogICAgICAgIGF1dG8gZnJhZ19hID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2EsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OnJvd19tYWpvcj4oKTsNCiAgICAgICAgYXV0byBmcmFnX2IgPSByb2N3bW1hOjpmcmFnbWVudDxyb2N3bW1hOjptYXRyaXhfYiwgV01NQV9NLCBXTU1BX04sIFdNTUFfSywgX19oaXBfZnA4X2U0bTNfZm51eiwgcm9jd21tYTo6Y29sX21ham9yPigpOyANCg0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDENCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRUNPTkQgSEFMRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICAgICAgICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmlfbG9hZCA9IDA7IGttaW5pX2xvYWQgPCA2NDsga21pbmlfbG9hZCArPSAxNil7ICAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIE0gKiAoa2Jhc2UgKyBrbWluaV9sb2FkICsgNjQgKyB0NjR5KV07DQogICAgICAgICAgICB0aWxlQVt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEFfcHRyW2Jsb2NrSWR4LnkgKiBXTU1BX00gKiBOVU1fV0FSUF9ZICsgdDY0eCArIDY0ICsgTSAqIChrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpXTsNCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eF07DQogICAgICAgICAgICB0aWxlQlt0NjR4ICsgNjRdW2ttaW5pX2xvYWQgKyB0NjR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pX2xvYWQgKyA2NCArIHQ2NHkpICogTiArIGJsb2NrSWR4LnggKiBXTU1BX04gKiBOVU1fV0FSUF9YICsgdDY0eCArIDY0XTsNCiAgICAgICAgfSAvLyBlbmQgZm9yIGttaW5pX2xvYWQgPCBLX0pVTVANCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7DQoNCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDY0OyBrbWluaSArPSBXTU1BX0spIHsgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2EsICZ0aWxlQVswXVswXSArICh3YXJwX2lkeF95ICogV01NQV9NKSAqIGxkYSArIGttaW5pLCBsZGEpOyAgICAgICAgICAgIA0KICAgICAgICAgICAgcm9jd21tYTo6bG9hZF9tYXRyaXhfc3luYyhmcmFnX2IsICZ0aWxlQlswXVswXSArIGttaW5pICsgbGRiICogKHdhcnBfaWR4X3ggKiBXTU1BX04pLCBsZGIpOw0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2ssIGZyYWdfYSwgZnJhZ19iLCBmcmFnX2FjY19ibG9jayk7DQogICAgICAgIH0gLy8gZW5kIGZvciBrbWluaQ0KICAgICAgICAvLyBBcHBseSBzY2FsZXINCg0KDQogICAgICAgIC8vIF9fc3luY3RocmVhZHMoKTsNCg0KICAgICAgICBpbnQgcGxhY2UgPSB3YXJwX2lkeF95ICogV01NQV9NICsgNCAqICh0NjR4IC8gMzIpOzsNCg0KICAgICAgICAvLyBpID0gMA0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFswXSAgKz0gdGlsZUFzW3BsYWNlICsgMF0gICogZnJhZ19hY2NfYmxvY2sueFswXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMV0gICs9IHRpbGVBc1twbGFjZSArIDFdICAqIGZyYWdfYWNjX2Jsb2NrLnhbMV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzJdICArPSB0aWxlQXNbcGxhY2UgKyAyXSAgKiBmcmFnX2FjY19ibG9jay54WzJdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFszXSAgKz0gdGlsZUFzW3BsYWNlICsgM10gICogZnJhZ19hY2NfYmxvY2sueFszXTsNCg0KICAgICAgICAvLyBpID0gMQ0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs0XSAgKz0gdGlsZUFzW3BsYWNlICsgOF0gICogZnJhZ19hY2NfYmxvY2sueFs0XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbNV0gICs9IHRpbGVBc1twbGFjZSArIDldICAqIGZyYWdfYWNjX2Jsb2NrLnhbNV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzZdICArPSB0aWxlQXNbcGxhY2UgKyAxMF0gKiBmcmFnX2FjY19ibG9jay54WzZdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs3XSAgKz0gdGlsZUFzW3BsYWNlICsgMTFdICogZnJhZ19hY2NfYmxvY2sueFs3XTsNCg0KICAgICAgICAvLyBpID0gMg0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFs4XSAgKz0gdGlsZUFzW3BsYWNlICsgMTZdICogZnJhZ19hY2NfYmxvY2sueFs4XTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbOV0gICs9IHRpbGVBc1twbGFjZSArIDE3XSAqIGZyYWdfYWNjX2Jsb2NrLnhbOV07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEwXSArPSB0aWxlQXNbcGxhY2UgKyAxOF0gKiBmcmFnX2FjY19ibG9jay54WzEwXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTFdICs9IHRpbGVBc1twbGFjZSArIDE5XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTFdOw0KDQogICAgICAgIC8vIGkgPSAzDQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzEyXSArPSB0aWxlQXNbcGxhY2UgKyAyNF0gKiBmcmFnX2FjY19ibG9jay54WzEyXTsNCiAgICAgICAgZnJhZ19hY2NfbWFzdGVyLnhbMTNdICs9IHRpbGVBc1twbGFjZSArIDI1XSAqIGZyYWdfYWNjX2Jsb2NrLnhbMTNdOw0KICAgICAgICBmcmFnX2FjY19tYXN0ZXIueFsxNF0gKz0gdGlsZUFzW3BsYWNlICsgMjZdICogZnJhZ19hY2NfYmxvY2sueFsxNF07DQogICAgICAgIGZyYWdfYWNjX21hc3Rlci54WzE1XSArPSB0aWxlQXNbcGxhY2UgKyAyN10gKiBmcmFnX2FjY19ibG9jay54WzE1XTsNCg0KICAgICAgICBfX3N5bmN0aHJlYWRzKCk7IC8vIFdlIG5lZWQgdGhpcyBzeW50aHJlYWRzKCkNCiAgICB9IC8vIGVuZCBmb3Iga2Jhc2UNCg0KICAgIGludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIGludCBjb2xfYmFzZV9DID0gKGJsb2NrSWR4LnggKiBOVU1fV0FSUF9YICsgd2FycF9pZHhfeCkgKiBXTU1BX047DQogICAgaWYgKGNvbF9iYXNlX0MgPj0gTikgcmV0dXJuOyAgICANCg0KICAgIGludCB3YXJwX2lkeF95ID0gdGhyZWFkSWR4Lnk7DQogICAgaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICBpZiAocm93X2Jhc2VfQyA+PSBNKSByZXR1cm47DQoNCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQoNCiAgICAvL2ludCB3YXJwX2lkeF94ID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7ICAgIA0KICAgIC8vaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsgIA0KDQogICAgLy9pbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIC8vaW50IHJvd19iYXNlX0MgPSAoYmxvY2tJZHgueSAqIE5VTV9XQVJQX1kgKyB3YXJwX2lkeF95KSAqIFdNTUFfTTsNCiAgICAgIA0KICAgIHJvY3dtbWE6OnN0b3JlX21hdHJpeF9zeW5jKENfcHRyICsgcm93X2Jhc2VfQyAqIE4gKyBjb2xfYmFzZV9DLCBmcmFnX3Jlc3VsdCwgTiwgcm9jd21tYTo6bWVtX3Jvd19tYWpvcik7DQp9DQoNCiNkZWZpbmUgS19KVU1QIDI1Ng0KI2RlZmluZSBXTU1BX00gMTYNCiNkZWZpbmUgV01NQV9OIDE2DQojZGVmaW5lIFdNTUFfSyAzMg0KI2RlZmluZSBOVU1fV0FSUF9YIDQNCiNkZWZpbmUgTlVNX1dBUlBfWSA0DQojZGVmaW5lIFdBUlBfU0laRSA2NA0KI2RlZmluZSBXTU1BX1BMQUNFSE9MREVSIDgNCg0KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKDEwMjQsIDgpIGtfbGFyZ2Vfa2VybmVsKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXoqIEFfcHRyLCBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6KiBCX3B0ciwgY29uc3QgZmxvYXQqIEFzX3B0ciwgY29uc3QgZmxvYXQqIEJzX3B0ciwgcm9jd21tYTo6YmZsb2F0MTZfdCogQ19wdHIsIGludCBNLCBpbnQgTiwgaW50IEspIHsNCiAgICAvKg0KICAgIFBlcmZvcm0gQiBAIEEuVCA9IEMuVCwgc28gd2UgY2FuIHN0b3JlIHNjYWxlIEFzIGluIGEgVkdQUiBvZiBlYWNoIHRocmVhZCBpbiBhIHdhcnANCiAgICBCOiBOeEsgY29sLW1haiAtLSBCcyAoMTI4eDEyOCBzY2FsaW5nKTogTi8xMjggeCBLLzEyOCBjb2wtbWFqDQogICAgQS5UOiBLeE0gcm93LW1haiAtLSBBcyAoMXgxMjggc2NhbGluZyk6IEsvIDEyOCB4IE0gcm93LW1hag0KICAgIEMuVDogTnhNIGNvbC1tYWoNCiAgICBNLCBOIGFyZSBkaXZpc2libGUgYnkgNjQsIEsgaXMgZGl2aXNpYmxlIGJ5IDI1Ng0KDQogICAgU01FTSB3aXRoIHBhZGRpbmcgcGVyIGJsb2NrOg0KICAgIDY0ICogKDI1NiArIDgpIC8gMTAyNCArIDY0ICogKDIyNCArIDgpIC8gMTAyNCA9IDE2LjUgKyAxNC41ID0gMzEgS0IgcGVyIGJsb2NrDQoNCiAgICAqLw0KICAgIGludCBzbiA9IChOICsgMTI4IC0gMSkgLyAxMjg7DQoNCiAgICBfX3NoYXJlZF9fIF9faGlwX2ZwOF9lNG0zX2ZudXogdGlsZUFbNjRdWzI1Nl07IC8vIGNvbC1tYWogPSByb3ctbWFqIHRyYW5zcG9zZWQgDQogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IHRpbGVCWzY0XVsyNTZdOyAvLyByb3ctbWFqDQoNCiAgICBhdXRvIGZyYWdfYWNjX21hc3RlciA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKTsNCiAgICByb2N3bW1hOjpmaWxsX2ZyYWdtZW50KGZyYWdfYWNjX21hc3RlciwgMC5mKTsNCg0KICAgIGNnOjp0aHJlYWRfYmxvY2sgdGhpc190YiA9IGNnOjp0aGlzX3RocmVhZF9ibG9jaygpOw0KDQogICAgZm9yIChpbnQga2Jhc2UgPSAwOyBrYmFzZSA8IEs7IGtiYXNlICs9IEtfSlVNUCkgew0KICAgICAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgICAgICBpbnQgcm93X2Jhc2VfQyA9IChibG9ja0lkeC55ICogTlVNX1dBUlBfWSArIHdhcnBfaWR4X3kpICogV01NQV9NOw0KICAgIA0KICAgICAgICBpbnQgd2FycF9pZHhfeCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOyAgICANCiAgICAgICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCg0KICAgICAgICBpbnQgdDY0eCA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAlIDY0Ow0KICAgICAgICBpbnQgdDY0eSA9IHRoaXNfdGIudGhyZWFkX3JhbmsoKSAvIDY0Ow0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsIDQNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCg0KICAgICAgICAgICAgdGlsZUJbdDY0eF1bS19pZHhfc2hpZnR5XSA9IEJfcHRyWyhrYmFzZSArIGttaW5pICsgdDY0eSkgKiBOICsgYmxvY2tJZHgueSAqIFdNTUFfTiAqIE5VTV9XQVJQX1kgKyB0NjR4XTsgICANCiAgICAgICAgICAgIHRpbGVCW3Q2NHhdWzEyOCArIEtfaWR4X3NoaWZ0eV0gPSBCX3B0clsoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpICogTiArIGJsb2NrSWR4LnkgKiBXTU1BX04gKiBOVU1fV0FSUF9ZICsgdDY0eF07DQogICAgICAgIH0gICANCiAgICAgICAgI3ByYWdtYSB1bnJvbGwNCiAgICAgICAgZm9yIChpbnQga21pbmkgPSAwOyBrbWluaSA8IDEyODsga21pbmkgKz0gMTYpeyAvLyAxNiBpcyBudW0gZ3JvdXANCiAgICAgICAgICAgIGludCBLX2lkeF9zaGlmdHkgPSAoa21pbmkgKyB0NjR5ICsgOCAqICh0NjR4ICUgMTYpKSAlIDEyODsgICAgICAgICAgICANCiAgICAgICAgICAgIHRpbGVBW3Q2NHhdW0tfaWR4X3NoaWZ0eV0gPSBBX3B0cltibG9ja0lkeC54ICogV01NQV9NICogTlVNX1dBUlBfWCArIHQ2NHggKyBNICogKGtiYXNlICsga21pbmkgKyB0NjR5KV07ICAgICAgIA0KICAgICAgIA0KICAgICAgICAgICAgdGlsZUFbdDY0eF1bMTI4ICsgS19pZHhfc2hpZnR5XSA9IEFfcHRyW2Jsb2NrSWR4LnggKiBXTU1BX00gKiBOVU1fV0FSUF9YICsgdDY0eCArIE0gKiAoMTI4ICsga2Jhc2UgKyBrbWluaSArIHQ2NHkpXTsNCiAgICAgICAgICAgIA0KICAgICAgICB9IA0KDQogICAgICAgIGZsb2F0IHRpbGVBczEgPSBBc19wdHJbKGtiYXNlIC8gMTI4KSAqIE0gKyBjb2xfYmFzZV9DICsgdDY0eCAlIFdNTUFfTl07DQogICAgICAgIGZsb2F0IHRpbGVCczEgPSBCc19wdHJbKGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMSA9IHRpbGVBczEgKiB0aWxlQnMxOw0KICAgICAgICBmbG9hdCB0aWxlQXMyID0gQXNfcHRyWygxICsga2Jhc2UgLyAxMjgpICogTSArIGNvbF9iYXNlX0MgKyB0NjR4ICUgV01NQV9OXTsNCiAgICAgICAgZmxvYXQgdGlsZUJzMiA9IEJzX3B0clsoMSArIGtiYXNlIC8gMTI4KSAqIHNuICsgKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICogV01NQV9NKSAvIDEyOF07DQogICAgICAgIGZsb2F0IHNjYWxlMiA9IHRpbGVBczIgKiB0aWxlQnMyOw0KDQogICAgICAgIF9fc3luY3RocmVhZHMoKTsgDQogICAgICAgIC8vIF9fdGhyZWFkZmVuY2VfYmxvY2soKTsNCiAgICAgICAgLy8gTUZNQQ0KDQogICAgICAgIC8vIE1GTUEgb24gU01FTQ0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIGZsb2F0PigpIDsNCiAgICAgICAgcm9jd21tYTo6ZmlsbF9mcmFnbWVudChmcmFnX2FjY19ibG9jaywgMC5mKTsNCg0KICAgICAgICBhdXRvIGZyYWdfYSA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6Om1hdHJpeF9hLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBfX2hpcF9mcDhfZTRtM19mbnV6LCByb2N3bW1hOjpyb3dfbWFqb3I+KCk7DQogICAgICAgIGF1dG8gZnJhZ19iID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6bWF0cml4X2IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX0ssIF9faGlwX2ZwOF9lNG0zX2ZudXosIHJvY3dtbWE6OmNvbF9tYWpvcj4oKTsNCg0KICAgICAgICAjcHJhZ21hIHVucm9sbA0KICAgICAgICBmb3IgKGludCBrbWluaSA9IDA7IGttaW5pIDwgMTI4OyBrbWluaSArPSBXTU1BX0spew0KICAgICAgICAgICAgaW50IHRpbGVCX3JvdyA9IHdhcnBfaWR4X3kgKiBXTU1BX00gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICBpbnQgS19pZHhfYmFzZSA9IGttaW5pICsgKHQ2NHggLyAxNikgKiA4Ow0KICAgICAgICAgICAgaW50IEtfaWR4X3NoaWZ0eUIgPSAoS19pZHhfYmFzZSArIDggKiB0aWxlQl9yb3cpICUgMTI4Ow0KICAgICAgICAgICAgLy8gbWVtY3B5KCZmcmFnX2EueFswXSwgJnRpbGVCW3RpbGVCX3Jvd11bS19pZHhfc2hpZnR5Ql0sIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbMF1bMF0gKyB0aWxlQl9yb3cgKiAyNTYgKyBLX2lkeF9zaGlmdHlCLCBzaXplb2YobG9uZykpOyANCg0KICAgICAgICAgICAgaW50IHRpbGVBX2NvbCA9IHdhcnBfaWR4X3ggKiBXTU1BX04gKyB0NjR4ICUgMTY7DQogICAgICAgICAgICAvLyBpbnQgS19pZHhfc2hpZnR5QSA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVBX2NvbCkgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYi54WzBdLCAmdGlsZUFbdGlsZUFfY29sXVtLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVswXVswXSArIHRpbGVBX2NvbCAqIDI1NiArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7DQogICAgICAgICAgICByb2N3bW1hOjptbWFfc3luYyhmcmFnX2FjY19ibG9jaywgZnJhZ19hLCBmcmFnX2IsIGZyYWdfYWNjX2Jsb2NrKTsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTEsIGZyYWdfYWNjX2Jsb2NrLnhbaV0sIGZyYWdfYWNjX21hc3Rlci54W2ldKTsgICAgICAgICAgICANCiAgICAgICAgfQ0KDQogICAgICAgIA0KICAgICAgICBhdXRvIGZyYWdfYWNjX2Jsb2NrMiA9IHJvY3dtbWE6OmZyYWdtZW50PHJvY3dtbWE6OmFjY3VtdWxhdG9yLCBXTU1BX00sIFdNTUFfTiwgV01NQV9LLCBmbG9hdD4oKSA7DQogICAgICAgIHJvY3dtbWE6OmZpbGxfZnJhZ21lbnQoZnJhZ19hY2NfYmxvY2syLCAwLmYpOw0KDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGttaW5pID0gMDsga21pbmkgPCAxMjg7IGttaW5pICs9IFdNTUFfSyl7DQogICAgICAgICAgICBpbnQgdGlsZUJfcm93ID0gd2FycF9pZHhfeSAqIFdNTUFfTSArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIGludCBLX2lkeF9iYXNlID0ga21pbmkgKyAodDY0eCAvIDE2KSAqIDg7DQogICAgICAgICAgICBpbnQgS19pZHhfc2hpZnR5QiA9IChLX2lkeF9iYXNlICsgOCAqIHRpbGVCX3JvdykgJSAxMjg7DQogICAgICAgICAgICAvLyBtZW1jcHkoJmZyYWdfYS54WzBdLCAmdGlsZUJbdGlsZUJfcm93XVsxMjggKyBLX2lkeF9zaGlmdHlCXSwgc2l6ZW9mKGxvbmcpKTsNCiAgICAgICAgICAgIG1lbWNweSgmZnJhZ19hLnhbMF0sICZ0aWxlQlswXVswXSArIHRpbGVCX3JvdyAqIDI1NiArIDEyOCArIEtfaWR4X3NoaWZ0eUIsIHNpemVvZihsb25nKSk7IA0KDQogICAgICAgICAgICBpbnQgdGlsZUFfY29sID0gd2FycF9pZHhfeCAqIFdNTUFfTiArIHQ2NHggJSAxNjsNCiAgICAgICAgICAgIC8vIGludCBLX2lkeF9zaGlmdHlBID0gKEtfaWR4X2Jhc2UgKyA4ICogdGlsZUFfY29sKSAlIDEyODsNCiAgICAgICAgICAgIC8vIG1lbWNweSgmZnJhZ19iLnhbMF0sICZ0aWxlQVt0aWxlQV9jb2xdWzEyOCArIEtfaWR4X3NoaWZ0eUJdLCBzaXplb2YobG9uZykpOw0KICAgICAgICAgICAgbWVtY3B5KCZmcmFnX2IueFswXSwgJnRpbGVBWzBdWzBdICsgdGlsZUFfY29sICogMjU2ICsgMTI4ICsgS19pZHhfc2hpZnR5Qiwgc2l6ZW9mKGxvbmcpKTsNCg0KICAgICAgICAgICAgcm9jd21tYTo6bW1hX3N5bmMoZnJhZ19hY2NfYmxvY2syLCBmcmFnX2EsIGZyYWdfYiwgZnJhZ19hY2NfYmxvY2syKTsNCiAgICAgICAgfSANCg0KDQoNCiAgICAgICAgLy8gTXVsdCBzY2FsZXJzDQogICAgICAgICNwcmFnbWEgdW5yb2xsDQogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKXsNCiAgICAgICAgICAgIGZyYWdfYWNjX21hc3Rlci54W2ldID0gZm1hZihzY2FsZTIsIGZyYWdfYWNjX2Jsb2NrMi54W2ldLCBmcmFnX2FjY19tYXN0ZXIueFtpXSk7ICAgICAgICAgICAgDQogICAgICAgIH0NCg0KDQogICAgfS8vIGVuZCBmb3IgKGludCBrYmFzZSA9IDA7IGtiYXNlIDwgSzsga2Jhc2UgKz0gMTI4KSANCiAgICBpbnQgd2FycF9pZHhfeSA9IHRocmVhZElkeC55Ow0KICAgIGludCByb3dfYmFzZV9DID0gKGJsb2NrSWR4LnkgKiBOVU1fV0FSUF9ZICsgd2FycF9pZHhfeSkgKiBXTU1BX007DQogICAgaWYgKHJvd19iYXNlX0MgPj0gTikgcmV0dXJuOw0KDQogICAgaW50IHdhcnBfaWR4X3ggPSB0aHJlYWRJZHgueCAvIFdBUlBfU0laRTsgICAgDQogICAgaW50IGNvbF9iYXNlX0MgPSAoYmxvY2tJZHgueCAqIE5VTV9XQVJQX1ggKyB3YXJwX2lkeF94KSAqIFdNTUFfTjsNCiAgICBpZiAoY29sX2Jhc2VfQyA+PSBNKSByZXR1cm47IA0KICAgICAgICANCiAgICAvLyBDb252ZXJ0IGZwMzIgdG8gYmYxNiBhbmQgc3RvcmUNCiAgICAvLyBUT0RPOiBjaGFuZ2UgV01NQV9QTEFDRUhPTERFUiBmcm9tIDggdG8gMTYNCiAgICBhdXRvIGZyYWdfcmVzdWx0ID0gcm9jd21tYTo6ZnJhZ21lbnQ8cm9jd21tYTo6YWNjdW11bGF0b3IsIFdNTUFfTSwgV01NQV9OLCBXTU1BX1BMQUNFSE9MREVSLCByb2N3bW1hOjpiZmxvYXQxNl90PigpOyAvL1BsYWNlaG9sZGVyIGZyYWcNCiAgICANCiAgICAjcHJhZ21hIHVucm9sbA0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ19hY2NfbWFzdGVyLm51bV9lbGVtZW50czsgKytpKSB7DQogICAgICAgIGZyYWdfcmVzdWx0LnhbaV0gPSAocm9jd21tYTo6YmZsb2F0MTZfdClmcmFnX2FjY19tYXN0ZXIueFtpXTsNCiAgICB9DQogICAgICAgDQogICAgcm9jd21tYTo6c3RvcmVfbWF0cml4X3N5bmMoQ19wdHIgKyByb3dfYmFzZV9DICsgTiAqIGNvbF9iYXNlX0MsIGZyYWdfcmVzdWx0LCBOLCByb2N3bW1hOjptZW1fY29sX21ham9yKTsNCn0NCg0KY29uc3RleHByIGludCBLX1ZBTFVFID0gNzE2ODsNCmNvbnN0ZXhwciBpbnQgTV9WQUxVRSA9IDYxNDQ7DQpjb25zdGV4cHIgaW50IE5fVkFMVUUgPSA0NjA4Ow0KY29uc3RleHByIGludCBOX1ZBTFVFMiA9IDE1MzY7DQpjb25zdGV4cHIgaW50IFRIUkVTSE9MRCA9IDEwMjQgKiA1NzY7IC8vIDU4OSw4MjQNCg0Kdm9pZCBmcDhfbW0odG9yY2g6OlRlbnNvciBhLCB0b3JjaDo6VGVuc29yIGIsIHRvcmNoOjpUZW5zb3IgYXMsIHRvcmNoOjpUZW5zb3IgYnMsIHRvcmNoOjpUZW5zb3IgYykgew0KICAgIGludCBNID0gYS5zaXplKDApOw0KICAgIGludCBOID0gYi5zaXplKDApOw0KICAgIGludCBLID0gYS5zaXplKDEpOw0KDQogICAgaW50IG51bV93YXJwX3ggPSBOVU1fV0FSUF9YOw0KICAgIGludCBudW1fd2FycF95ID0gTlVNX1dBUlBfWTsNCiAgICBkaW0zIGJsb2NrX3NpemUoKFdBUlBfU0laRSAqIG51bV93YXJwX3gpLCBudW1fd2FycF95KTsNCiAgICANCiAgICBpZiAoSyAhPSBLX1ZBTFVFKSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChOICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChNICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2Vfb2xkX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIGlmIChNID09IE1fVkFMVUUgJiYgKE4gPT0gTl9WQUxVRSB8fCBOID09IE5fVkFMVUUyKSkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTiArIG51bV93YXJwX3ggKiAzMiAtIDEpIC8gKG51bV93YXJwX3ggKiAzMiksIA0KICAgICAgICAgICAgICAgICAgICAoTSArIG51bV93YXJwX3kgKiAzMiAtIDEpIC8gKG51bV93YXJwX3kgKiAzMikpOw0KICAgICAgICBiYWxhbmNlX29sZF9rZXJuZWw8PDxncmlkX3NpemUsIGJsb2NrX3NpemUsIDAsIDA+Pj4gKChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksIGFzLmRhdGFfcHRyPGZsb2F0PigpLCBicy5kYXRhX3B0cjxmbG9hdD4oKSwgKHJvY3dtbWE6OmJmbG9hdDE2X3QqKWMuZGF0YV9wdHIoKSwgTSwgTiwgSyk7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgDQogICAgaWYgKE0gKiBOIDw9IFRIUkVTSE9MRCkgew0KICAgICAgICBkaW0zIGdyaWRfc2l6ZSgoTSArIG51bV93YXJwX3ggKiAxNiAtIDEpIC8gKG51bV93YXJwX3ggKiAxNiksIA0KICAgICAgICAgICAgICAgICAgICAoTiArIG51bV93YXJwX3kgKiAxNiAtIDEpIC8gKG51bV93YXJwX3kgKiAxNikpOw0KICAgICAgICBrX2xhcmdlX2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgfQ0KDQogICAgZWxzZSB7DQogICAgICAgIGRpbTMgZ3JpZF9zaXplKChNICsgbnVtX3dhcnBfeCAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeCAqIDMyKSwgDQogICAgICAgICAgICAgICAgICAgIChOICsgbnVtX3dhcnBfeSAqIDMyIC0gMSkgLyAobnVtX3dhcnBfeSAqIDMyKSk7DQogICAgICAgIGJhbGFuY2VfbmV3X2tlcm5lbDw8PGdyaWRfc2l6ZSwgYmxvY2tfc2l6ZSwgMCwgMD4+PiAoKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXoqKWIuZGF0YV9wdHIoKSwgYXMuZGF0YV9wdHI8ZmxvYXQ+KCksIGJzLmRhdGFfcHRyPGZsb2F0PigpLCAocm9jd21tYTo6YmZsb2F0MTZfdCopYy5kYXRhX3B0cigpLCBNLCBOLCBLKTsNCiAgICAgICAgcmV0dXJuOyAgICANCiAgICB9DQp9DQoiIiINCg0KaW1wb3J0IG9zDQpvcy5lbnZpcm9uWyJDWFgiXSA9ICJjbGFuZysrIg0KaW1wb3J0IHRvcmNoDQpibG9ja19zaGFwZSA9IDEyOA0KDQoNCiMgYmlnIG9uZSwgdXNlZCB3aGVuIE4gaXMgPj0gMzA3Mg0KbW9kdWxlX2JpZyA9IGxvYWRfaW5saW5lKA0KICAgIG5hbWU9J2ZwOF9tbScsDQogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwNCiAgICBjdWRhX3NvdXJjZXM9W0NVREFfU1JDXSwNCiAgICBmdW5jdGlvbnM9WydmcDhfbW0nXSwNCiAgICB2ZXJib3NlPVRydWUsDQogICAgZXh0cmFfY3VkYV9jZmxhZ3M9WyItc3RkPWMrKzIwIl0sICAgIA0KKQ0KDQpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoNCiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQ0KICAgIG1vZHVsZV9iaWcuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpIA0KICAgIHJldHVybiBjDQo=No newline at end of file
Best evidence level for this revision: reported
JSON