ZGlmZiAtLWdpdCBhL2luY2x1ZGUvaW9zIGIvaW5jbHVkZS9pb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1OGU1OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaW9zCkBAIC0wLDAgKzEsOTY1IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGlvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyDKysrKysrKysrKysrKysrKysrKylRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0lPUworI2RlZmluZSBfTElCQ1BQX0lPUworCisvKgorICAgIGlvcyBzeW5vcHNpcworCisjaW5jbHVkZSA8aW9zZndkPgorCituYW1lc3BhY2Ugc3RkCit7CisKK3R5cGVkZWYgT0ZGX1Qgc3RyZWFtb2ZmOwordHlwZWRlZiBTWl9UIHN0cmVhbXNpemU7Cit0ZW1wbGF0ZSA8Y2xhc3Mgc3RhdGVUPiBjbGFzcyBmcG9zOworCitjbGFzcyBpb3NfYmFzZQoreworcHVibGljOgorICAgIGNsYXNzIGZhaWx1cmU7CisKKyAgICB0eXBlZGVmIFQxIGZtdGZsYWdzOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBib29sYWxwaGE7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGRlYzsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZml4ZWQ7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGhleDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgaW50ZXJuYWw7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGxlZnQ7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIG9jdDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgcmlnaHQ7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNjaWVudGlmaWM7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNob3diYXNlOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93cG9pbnQ7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNob3dwb3M7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNraXB3czsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgdW5pdGJ1ZjsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgdXBwZXJjYXNlOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBhZGp1c3RmaWVsZDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgYmFzZWZpZWxkOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBmbG9hdGZpZWxkOworCisgICAgdHlwZWRlZiBUMiBpb3N0YXRlOworICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGJhZGJpdDsKKyAgICBzdGF0aWMgY29uc3QgaW9zdGF0ZSBlb2ZiaXQ7CisgICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgZmFpbGJpdDsKKyAgICBzdGF0aWMgY29uc3QgaW9zdGF0ZSBnb29kYml0OworCisgICAgdHlwZWRlZiBUMyBvcGVubW9kZTsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYXBwOworICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBhdGU7CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGJpbmFyeTsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgaW47CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIG91dDsKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgdHJ1bmM7CisKKyAgICB0eXBlZGVmIFQ0IHNlZWtkaXI7CisgICAgc3RhdGljIGNvbnN0IHNlZWtkaXIgYmVnOworICAgIHN0YXRpYyBjb25zdCBzZWVrZGlyIGN1cjsKKyAgICBzdGF0aWMgY29uc3Qgc2Vla2RpciBlbmQ7CisKKyAgICBjbGFzcyBJbml0OworCisgICAgLy8gMjcuNS4yLjIgZm10ZmxhZ3Mgc3RhdGU6CisgICAgZm10ZmxhZ3MgZmxhZ3MoKSBjb25zdDsKKyAgICBmbXRmbGFncyBmbGFncyhmbXRmbGFncyBmbXRmbCk7CisgICAgZm10ZmxhZ3Mgc2V0ZihmbXRmbGFncyBmbXRmbCk7CisgICAgZm10ZmxhZ3Mgc2V0ZihmbXRmbGFncyBmbXRmbCwgZm10ZmxhZ3MgbWFzayk7CisgICAgdm9pZCB1bnNldGYoZm10ZmxhZ3MgbWFzayk7CisKKyAgICBzdHJlYW1zaXplIHByZWNpc2lvbigpIGNvbnN0OworICAgIHN0cmVhbXNpemUgcHJlY2lzaW9uKHN0cmVhbXNpemUgcHJlYyk7CisgICAgc3RyZWFtc2l6ZSB3aWR0aCgpIGNvbnN0OworICAgIHN0cmVhbXNpemUgd2lkdGgoc3RyZWFtc2l6ZSB3aWRlKTsKKworICAgIC8vIDI3LjUuMi4zIGxvY2FsZXM6CisgICAgbG9jYWxlIGltYnVlKGNvbnN0IGxvY2FsZSYgbG9jKTsKKyAgICBsb2NhbGUgZ2V0bG9jKCkgY29uc3Q7CisKKyAgICAvLyAyNy41LjIuNSBzdG9yYWdlOgorICAgIHN0YXRpYyBpbnQgeGFsbG9jKCk7CisgICAgbG9uZyYgaXdvcmQoaW50IGluZGV4KTsKKyAgICB2b2lkKiYgcHdvcmQoaW50IGluZGV4KTsKKworICAgIC8vIGRlc3RydWN0b3IKKyAgICB2aXJ0dWFsIH5pb3NfYmFzZSgpOworCisgICAgLy8gMjcuNS4yLjYgY2FsbGJhY2tzOworICAgIGVudW0gZXZlbnQgeyBlcmFzZV9ldmVudCwgaW1idWVfZXZlbnQsIGNvcHlmbXRfZXZlbnQgfTsKKyAgICB0eXBlZGVmIHZvaWQgKCpldmVudF9jYWxsYmFjaykoZXZlbnQsIGlvc19iYXNlJiwgaW50IGluZGV4KTsKKyAgICB2b2lkIHJlZ2lzdGVyX2NhbGxiYWNrKGV2ZW50X2NhbGxiYWNrIGZuLCBpbnQgaW5kZXgpOworCisgICAgaW9zX2Jhc2UoY29uc3QgaW9zX2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICBpb3NfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IGlvc19iYXNlJikgPSBkZWxldGU7CisKKyAgICBzdGF0aWMgYm9vbCBzeW5jX3dpdGhfc3RkaW8oYm9vbCBzeW5jID0gdHJ1ZSk7CisKK3Byb3RlY3RlZDoKKyAgICBpb3NfYmFzZSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBjaGFyX3RyYWl0czxjaGFyVD4gPgorY2xhc3MgYmFzaWNfaW9zCisgICAgOiBwdWJsaWMgaW9zX2Jhc2UKK3sKK3B1YmxpYzoKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIGNoYXJUIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0czo6aW50X3R5cGUgaW50X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHM6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzOjpvZmZfdHlwZSBvZmZfdHlwZTsKKyAgICB0eXBlZGVmIHRyYWl0cyB0cmFpdHNfdHlwZTsKKworICAgIG9wZXJhdG9yIHVuc3BlY2lmaWVkLWJvb2wtdHlwZSgpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3Q7CisgICAgaW9zdGF0ZSByZHN0YXRlKCkgY29uc3Q7CisgICAgdm9pZCBjbGVhcihpb3N0YXRlIHN0YXRlID0gZ29vZGJpdCk7CisgICAgdm9pZCBzZXRzdGF0ZShpb3N0YXRlIHN0YXRlKTsKKyAgICBib29sIGdvb2QoKSBjb25zdDsKKyAgICBib29sIGVvZigpIGNvbnN0OworICAgIGJvb2wgZmFpbCgpIGNvbnN0OworICAgIGJvb2wgYmFkKCkgY29uc3Q7CisKKyAgICBpb3N0YXRlIGV4Y2VwdGlvbnMoKSBjb25zdDsKKyAgICB2b2lkIGV4Y2VwdGlvbnMoaW9zdGF0ZSBleGNlcHQpOworCisgICAgLy8gMjcuNS40LjEgQ29uc3RydWN0b3IvZGVzdHJ1Y3RvcjoKKyAgICBleHBsaWNpdCBiYXNpY19pb3MoYmFzaWNfc3RyZWFtYnVmPGNoYXJULHRyYWl0cz4qIHNiKTsKKyAgICB2aXJ0dWFsIH5iYXNpY19pb3MoKTsKKworICAgIC8vIDI3LjUuNC4yIE1lbWJlcnM6CisgICAgYmFzaWNfb3N0cmVhbTxjaGFyVCx0cmFpdHM+KiB0aWUoKSBjb25zdDsKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4qIHRpZShiYXNpY19vc3RyZWFtPGNoYXJULHRyYWl0cz4qIHRpZXN0cik7CisKKyAgICBiYXNpY19zdHJlYW1idWY8Y2hhclQsdHJhaXRzPiogcmRidWYoKSBjb25zdDsKKyAgICBiYXNpY19zdHJlYW1idWY8Y2hhclQsdHJhaXRzPiogcmRidWYoYmFzaWNfc3RyZWFtYnVmPGNoYXJULHRyYWl0cz4qIHNiKTsKKworICAgIGJhc2ljX2lvcyYgY29weWZtdChjb25zdCBiYXNpY19pb3MmIHJocyk7CisKKyAgICBjaGFyX3R5cGUgZmlsbCgpIGNvbnN0OworICAgIGNoYXJfdHlwZSBmaWxsKGNoYXJfdHlwZSBjaCk7CisKKyAgICBsb2NhbGUgaW1idWUoY29uc3QgbG9jYWxlJiBsb2MpOworCisgICAgY2hhciBuYXJyb3coY2hhcl90eXBlIGMsIGNoYXIgZGZhdWx0KSBjb25zdDsKKyAgICBjaGFyX3R5cGUgd2lkZW4oY2hhciBjKSBjb25zdDsKKworICAgIGJhc2ljX2lvcyhjb25zdCBiYXNpY19pb3MmICkgPSBkZWxldGU7CisgICAgYmFzaWNfaW9zJiBvcGVyYXRvcj0oY29uc3QgYmFzaWNfaW9zJikgPSBkZWxldGU7CisKK3Byb3RlY3RlZDoKKyAgICBiYXNpY19pb3MoKTsKKyAgICB2b2lkIGluaXQoYmFzaWNfc3RyZWFtYnVmPGNoYXJULHRyYWl0cz4qIHNiKTsKKyAgICB2b2lkIG1vdmUoYmFzaWNfaW9zJiByaHMpOworICAgIHZvaWQgc3dhcChiYXNpY19pb3MmIHJocyk7CisgICAgdm9pZCBzZXRfcmRidWYoYmFzaWNfc3RyZWFtYnVmPGNoYXJULCB0cmFpdHM+KiBzYik7Cit9OworCisvLyAyNy41LjUsIG1hbmlwdWxhdG9yczoKK2lvc19iYXNlJiBib29sYWxwaGEgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG5vYm9vbGFscGhhKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIHNob3diYXNlIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBub3Nob3diYXNlIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBzaG93cG9pbnQgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG5vc2hvd3BvaW50KGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIHNob3dwb3MgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG5vc2hvd3BvcyAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgc2tpcHdzIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBub3NraXB3cyAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgdXBwZXJjYXNlIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBub3VwcGVyY2FzZShpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiB1bml0YnVmIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBub3VuaXRidWYgKGlvc19iYXNlJiBzdHIpOworCisvLyAyNy41LjUuMiBhZGp1c3RmaWVsZDoKK2lvc19iYXNlJiBpbnRlcm5hbCAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgbGVmdCAoaW9zX2Jhc2UmIHN0cik7Citpb3NfYmFzZSYgcmlnaHQgKGlvc19iYXNlJiBzdHIpOworCisvLyAyNy41LjUuMyBiYXNlZmllbGQ6Citpb3NfYmFzZSYgZGVjIChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBoZXggKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIG9jdCAoaW9zX2Jhc2UmIHN0cik7CisKKy8vIDI3LjUuNS40IGZsb2F0ZmllbGQ6Citpb3NfYmFzZSYgZml4ZWQgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIHNjaWVudGlmaWMgKGlvc19iYXNlJiBzdHIpOworaW9zX2Jhc2UmIGhleGZsb2F0IChpb3NfYmFzZSYgc3RyKTsKK2lvc19iYXNlJiBkZWZhdWx0ZmxvYXQoaW9zX2Jhc2UmIHN0cik7CisKKy8vIDI3LjUuNS41IGVycm9yIHJlcG9ydGluZzoKK2VudW0gY2xhc3MgaW9fZXJyYworeworICAgIHN0cmVhbSA9IDEKK307CisKK2NvbmNlcHRfbWFwIEVycm9yQ29kZUVudW08aW9fZXJyYz4geyB9OworZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoaW9fZXJyYyBlKTsKK2Vycm9yX2NvbmRpdGlvbiBtYWtlX2Vycm9yX2NvbmRpdGlvbihpb19lcnJjIGUpOworc3RvcmFnZS1jbGFzcy1zcGVjaWZpZXIgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGlvc3RyZWFtX2NhdGVnb3J5OworCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxfX2xvY2FsZT4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3R5cGVkZWYgcHRyZGlmZl90IHN0cmVhbXNpemU7CisKK2NsYXNzIGlvc19iYXNlCit7CitwdWJsaWM6CisgICAgY2xhc3MgZmFpbHVyZTsKKworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IGZtdGZsYWdzOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBib29sYWxwaGEgICA9IDB4MDAwMTsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZGVjICAgICAgICAgPSAweDAwMDI7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGZpeGVkICAgICAgID0gMHgwMDA0OworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBoZXggICAgICAgICA9IDB4MDAwODsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgaW50ZXJuYWwgICAgPSAweDAwMTA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGxlZnQgICAgICAgID0gMHgwMDIwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBvY3QgICAgICAgICA9IDB4MDA0MDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgcmlnaHQgICAgICAgPSAweDAwODA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNjaWVudGlmaWMgID0gMHgwMTAwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93YmFzZSAgICA9IDB4MDIwMDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2hvd3BvaW50ICAgPSAweDA0MDA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHNob3dwb3MgICAgID0gMHgwODAwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBza2lwd3MgICAgICA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgdW5pdGJ1ZiAgICAgPSAweDIwMDA7CisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIHVwcGVyY2FzZSAgID0gMHg0MDAwOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBhZGp1c3RmaWVsZCA9IGxlZnQgfCByaWdodCB8IGludGVybmFsOworICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBiYXNlZmllbGQgICA9IGRlYyB8IG9jdCB8IGhleDsKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZmxvYXRmaWVsZCAgPSBzY2llbnRpZmljIHwgZml4ZWQ7CisKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBpb3N0YXRlOworICAgIHR5cGVkZWYgaW9zdGF0ZSAgICAgIGlvX3N0YXRlOworICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGJhZGJpdCAgPSAweDE7CisgICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgZW9mYml0ICA9IDB4MjsKKyAgICBzdGF0aWMgY29uc3QgaW9zdGF0ZSBmYWlsYml0ID0gMHg0OworICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGdvb2RiaXQgPSAweDA7CisKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBvcGVubW9kZTsKKyAgICB0eXBlZGVmIG9wZW5tb2RlICAgICBvcGVuX21vZGU7CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGFwcCAgICA9IDB4MDE7CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGF0ZSAgICA9IDB4MDI7CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGJpbmFyeSA9IDB4MDQ7CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGluICAgICA9IDB4MDg7CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIG91dCAgICA9IDB4MTA7CisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIHRydW5jICA9IDB4MjA7CisKKyAgICBlbnVtIHNlZWtkaXIge2JlZywgY3VyLCBlbmR9OworICAgIHR5cGVkZWYgc2Vla2RpciBzZWVrX2RpcjsKKworICAgIHR5cGVkZWYgX1NURDo6c3RyZWFtb2ZmIHN0cmVhbW9mZjsKKyAgICB0eXBlZGVmIF9TVEQ6OnN0cmVhbXBvcyBzdHJlYW1wb3M7CisKKyAgICBjbGFzcyBJbml0OworCisgICAgLy8gMjcuNS4yLjIgZm10ZmxhZ3Mgc3RhdGU6CisgICAgZm10ZmxhZ3MgZmxhZ3MoKSBjb25zdDsKKyAgICBmbXRmbGFncyBmbGFncyhmbXRmbGFncyBfX2ZtdGZsKTsKKyAgICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIF9fZm10ZmwpOworICAgIGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgX19mbXRmbCwgZm10ZmxhZ3MgX19tYXNrKTsKKyAgICB2b2lkIHVuc2V0ZihmbXRmbGFncyBfX21hc2spOworCisgICAgc3RyZWFtc2l6ZSBwcmVjaXNpb24oKSBjb25zdDsKKyAgICBzdHJlYW1zaXplIHByZWNpc2lvbihzdHJlYW1zaXplIF9fcHJlYyk7CisgICAgc3RyZWFtc2l6ZSB3aWR0aCgpIGNvbnN0OworICAgIHN0cmVhbXNpemUgd2lkdGgoc3RyZWFtc2l6ZSBfX3dpZGUpOworCisgICAgLy8gMjcuNS4yLjMgbG9jYWxlczoKKyAgICBsb2NhbGUgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisgICAgbG9jYWxlIGdldGxvYygpIGNvbnN0OworCisgICAgLy8gMjcuNS4yLjUgc3RvcmFnZToKKyAgICBzdGF0aWMgaW50IHhhbGxvYygpOworICAgIGxvbmcmIGl3b3JkKGludCBfX2luZGV4KTsKKyAgICB2b2lkKiYgcHdvcmQoaW50IF9faW5kZXgpOworCisgICAgLy8gZGVzdHJ1Y3RvcgorICAgIHZpcnR1YWwgfmlvc19iYXNlKCk7CisKKyAgICAvLyAyNy41LjIuNiBjYWxsYmFja3M7CisgICAgZW51bSBldmVudCB7IGVyYXNlX2V2ZW50LCBpbWJ1ZV9ldmVudCwgY29weWZtdF9ldmVudCB9OworICAgIHR5cGVkZWYgdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShldmVudCwgaW9zX2Jhc2UmLCBpbnQgX19pbmRleCk7CisgICAgdm9pZCByZWdpc3Rlcl9jYWxsYmFjayhldmVudF9jYWxsYmFjayBfX2ZuLCBpbnQgX19pbmRleCk7CisKK3ByaXZhdGU6CisgICAgaW9zX2Jhc2UoY29uc3QgaW9zX2Jhc2UmKTsgLy8gPSBkZWxldGU7CisgICAgaW9zX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBpb3NfYmFzZSYpOyAvLyA9IGRlbGV0ZTsKKworcHVibGljOgorICAgIHN0YXRpYyBib29sIHN5bmNfd2l0aF9zdGRpbyhib29sIF9fc3luYyA9IHRydWUpOworCisgICAgaW9zdGF0ZSByZHN0YXRlKCkgY29uc3Q7CisgICAgdm9pZCBjbGVhcihpb3N0YXRlIF9fc3RhdGUgPSBnb29kYml0KTsKKyAgICB2b2lkIHNldHN0YXRlKGlvc3RhdGUgX19zdGF0ZSk7CisgICAgCisgICAgYm9vbCBnb29kKCkgY29uc3Q7IAorICAgIGJvb2wgZW9mKCkgY29uc3Q7IAorICAgIGJvb2wgZmFpbCgpIGNvbnN0OyAKKyAgICBib29sIGJhZCgpIGNvbnN0OyAKKworICAgIGlvc3RhdGUgZXhjZXB0aW9ucygpIGNvbnN0OyAKKyAgICB2b2lkIGV4Y2VwdGlvbnMoaW9zdGF0ZSBfX2V4Y2VwdCk7CisKKyAgICB2b2lkIF9fc2V0X2JhZGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworICAgIHZvaWQgX19zZXRfZmFpbGJpdF9hbmRfY29uc2lkZXJfcmV0aHJvdygpOworCitwcm90ZWN0ZWQ6CisgICAgaW9zX2Jhc2UoKSB7Ly8gcHVycG9zZWZ1bGx5IGRvZXMgbm8gaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgIH0KKworICAgIHZvaWQgaW5pdCh2b2lkKiBfX3NiKTsKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdm9pZCogcmRidWYoKSBjb25zdCB7cmV0dXJuIF9fcmRidWZfO30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORQorICAgIHZvaWQgcmRidWYodm9pZCogX19zYikKKyAgICB7CisgICAgICAgIF9fcmRidWZfID0gX19zYjsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIF9fY2FsbF9jYWxsYmFja3MoZXZlbnQpOworICAgIHZvaWQgY29weWZtdChjb25zdCBpb3NfYmFzZSYpOworICAgIHZvaWQgbW92ZShpb3NfYmFzZSYpOworICAgIHZvaWQgc3dhcChpb3NfYmFzZSYpOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FCisgICAgdm9pZCBzZXRfcmRidWYodm9pZCogX19zYikKKyAgICB7CisgICAgICAgIF9fcmRidWZfID0gX19zYjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gQWxsIGRhdGEgbWVtYmVycyBtdXN0IGJlIHNjYWxhcnMKKyAgICBmbXRmbGFncyAgICAgICAgX19mbXRmbGFnc187CisgICAgc3RyZWFtc2l6ZSAgICAgIF9fcHJlY2lzaW9uXzsKKyAgICBzdHJlYW1zaXplICAgICAgX193aWR0aF87CisgICAgaW9zdGF0ZSAgICAgICAgIF9fcmRzdGF0ZV87CisgICAgaW9zdGF0ZSAgICAgICAgIF9fZXhjZXB0aW9uc187CisgICAgdm9pZCogICAgICAgICAgIF9fcmRidWZfOworICAgIHZvaWQqICAgICAgICAgICBfX2xvY187CisgICAgZXZlbnRfY2FsbGJhY2sqIF9fZm5fOworICAgIGludCogICAgICAgICAgICBfX2luZGV4XzsKKyAgICBzaXplX3QgICAgICAgICAgX19ldmVudF9zaXplXzsKKyAgICBzaXplX3QgICAgICAgICAgX19ldmVudF9jYXBfOworICAgIHN0YXRpYyBpbnQgICAgICBfX3hpbmRleF87CisgICAgbG9uZyogICAgICAgICAgIF9faWFycmF5XzsKKyAgICBzaXplX3QgICAgICAgICAgX19pYXJyYXlfc2l6ZV87CisgICAgc2l6ZV90ICAgICAgICAgIF9faWFycmF5X2NhcF87CisgICAgdm9pZCoqICAgICAgICAgIF9fcGFycmF5XzsKKyAgICBzaXplX3QgICAgICAgICAgX19wYXJyYXlfc2l6ZV87CisgICAgc2l6ZV90ICAgICAgICAgIF9fcGFycmF5X2NhcF87Cit9OworCisvL2VudW0gY2xhc3MgaW9fZXJyYworc3RydWN0IGlvX2VycmMKK3sKK2VudW0gXyB7CisgICAgc3RyZWFtID0gMQorfTsKKyAgICBfIF9fdl87CisKKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgaW9fZXJyYyhfIF9fdikgOiBfX3ZfKF9fdikge30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgb3BlcmF0b3IgaW50KCkgY29uc3Qge3JldHVybiBfX3ZfO30KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08aW9fZXJyYz4gOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW08aW9fZXJyYzo6Xz4gOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGlvc3RyZWFtX2NhdGVnb3J5KCk7CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitlcnJvcl9jb2RlCittYWtlX2Vycm9yX2NvZGUoaW9fZXJyYyBfX2UpCit7CisgICAgcmV0dXJuIGVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihfX2UpLCBpb3N0cmVhbV9jYXRlZ29yeSgpKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Vycm9yX2NvbmRpdGlvbgorbWFrZV9lcnJvcl9jb25kaXRpb24oaW9fZXJyYyBfX2UpCit7CisgICAgcmV0dXJuIGVycm9yX2NvbmRpdGlvbihzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGlvc3RyZWFtX2NhdGVnb3J5KCkpOworfQorCitjbGFzcyBpb3NfYmFzZTo6ZmFpbHVyZQorICAgIDogcHVibGljIHN5c3RlbV9lcnJvcgoreyAKK3B1YmxpYzogCisgICAgZXhwbGljaXQgZmFpbHVyZShjb25zdCBzdHJpbmcmIF9fbXNnLCBjb25zdCBlcnJvcl9jb2RlJiBfX2VjID0gaW9fZXJyYzo6c3RyZWFtKTsKKyAgICBleHBsaWNpdCBmYWlsdXJlKGNvbnN0IGNoYXIqIF9fbXNnLCBjb25zdCBlcnJvcl9jb2RlJiBfX2VjID0gaW9fZXJyYzo6c3RyZWFtKTsgCisgICAgdmlydHVhbCB+ZmFpbHVyZSgpIHRocm93KCk7Cit9OworCitjbGFzcyBpb3NfYmFzZTo6SW5pdAoreworcHVibGljOgorICAgIEluaXQoKTsKKyAgICB+SW5pdCgpOworfTsKKworLy8gZm10ZmxhZ3MKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlOjpmbXRmbGFncworaW9zX2Jhc2U6OmZsYWdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19mbXRmbGFnc187Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZTo6Zm10ZmxhZ3MKK2lvc19iYXNlOjpmbGFncyhmbXRmbGFncyBfX2ZtdGZsKQoreworICAgIGZtdGZsYWdzIF9fciA9IF9fZm10ZmxhZ3NfOworICAgIF9fZm10ZmxhZ3NfID0gX19mbXRmbDsKKyAgICByZXR1cm4gX19yOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2U6OmZtdGZsYWdzCitpb3NfYmFzZTo6c2V0ZihmbXRmbGFncyBfX2ZtdGZsKQoreworICAgIGZtdGZsYWdzIF9fciA9IF9fZm10ZmxhZ3NfOworICAgIF9fZm10ZmxhZ3NfIHw9IF9fZm10Zmw7CisgICAgcmV0dXJuIF9fcjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3ZvaWQKK2lvc19iYXNlOjp1bnNldGYoZm10ZmxhZ3MgX19tYXNrKQoreworICAgIF9fZm10ZmxhZ3NfICY9IH5fX21hc2s7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZTo6Zm10ZmxhZ3MKK2lvc19iYXNlOjpzZXRmKGZtdGZsYWdzIF9fZm10ZmwsIGZtdGZsYWdzIF9fbWFzaykKK3sKKyAgICBmbXRmbGFncyBfX3IgPSBfX2ZtdGZsYWdzXzsKKyAgICB1bnNldGYoX19tYXNrKTsKKyAgICBfX2ZtdGZsYWdzXyB8PSBfX2ZtdGZsICYgX19tYXNrOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIHByZWNpc2lvbgorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorc3RyZWFtc2l6ZQoraW9zX2Jhc2U6OnByZWNpc2lvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fcHJlY2lzaW9uXzsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3N0cmVhbXNpemUKK2lvc19iYXNlOjpwcmVjaXNpb24oc3RyZWFtc2l6ZSBfX3ByZWMpCit7CisgICAgc3RyZWFtc2l6ZSBfX3IgPSBfX3ByZWNpc2lvbl87CisgICAgX19wcmVjaXNpb25fID0gX19wcmVjOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIHdpZHRoCisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitzdHJlYW1zaXplCitpb3NfYmFzZTo6d2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBfX3dpZHRoXzsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK3N0cmVhbXNpemUKK2lvc19iYXNlOjp3aWR0aChzdHJlYW1zaXplIF9fd2lkZSkKK3sKKyAgICBzdHJlYW1zaXplIF9fciA9IF9fd2lkdGhfOworICAgIF9fd2lkdGhfID0gX193aWRlOworICAgIHJldHVybiBfX3I7Cit9CisKKy8vIGlvc3RhdGUKKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlOjppb3N0YXRlCitpb3NfYmFzZTo6cmRzdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fcmRzdGF0ZV87Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitpb3NfYmFzZTo6c2V0c3RhdGUoaW9zdGF0ZSBfX3N0YXRlKQoreworICAgIGNsZWFyKF9fcmRzdGF0ZV8gfCBfX3N0YXRlKTsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jvb2wKK2lvc19iYXNlOjpnb29kKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19yZHN0YXRlXyA9PSAwOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYm9vbAoraW9zX2Jhc2U6OmVvZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fcmRzdGF0ZV8gJiBlb2ZiaXQ7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitpb3NfYmFzZTo6ZmFpbCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fcmRzdGF0ZV8gJiAoZmFpbGJpdCB8IGJhZGJpdCk7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitib29sCitpb3NfYmFzZTo6YmFkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19yZHN0YXRlXyAmIGJhZGJpdDsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlOjppb3N0YXRlCitpb3NfYmFzZTo6ZXhjZXB0aW9ucygpIGNvbnN0Cit7CisgICAgcmV0dXJuIF9fZXhjZXB0aW9uc187Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitpb3NfYmFzZTo6ZXhjZXB0aW9ucyhpb3N0YXRlIF9fZXhjZXB0KQoreworICAgIF9fZXhjZXB0aW9uc18gPSBfX2V4Y2VwdDsKKyAgICBjbGVhcihfX3Jkc3RhdGVfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2NsYXNzIGJhc2ljX2lvcworICAgIDogcHVibGljIGlvc19iYXNlCit7CitwdWJsaWM6CisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBfQ2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgX1RyYWl0cyB0cmFpdHNfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIC8vIGV4cGxpY2l0CisgICAgICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7cmV0dXJuICFmYWlsKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBib29sIG9wZXJhdG9yISgpIGNvbnN0ICAgIHtyZXR1cm4gIGZhaWwoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGlvc3RhdGUgcmRzdGF0ZSgpIGNvbnN0ICAge3JldHVybiBpb3NfYmFzZTo6cmRzdGF0ZSgpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdm9pZCBjbGVhcihpb3N0YXRlIF9fc3RhdGUgPSBnb29kYml0KSB7aW9zX2Jhc2U6OmNsZWFyKF9fc3RhdGUpO30KKyAgICBfTElCQ1BQX0FMV0FZU19JTkxJTkUgdm9pZCBzZXRzdGF0ZShpb3N0YXRlIF9fc3RhdGUpIHtpb3NfYmFzZTo6c2V0c3RhdGUoX19zdGF0ZSk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBib29sIGdvb2QoKSBjb25zdCB7cmV0dXJuIGlvc19iYXNlOjpnb29kKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBib29sIGVvZigpIGNvbnN0ICB7cmV0dXJuIGlvc19iYXNlOjplb2YoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGJvb2wgZmFpbCgpIGNvbnN0IHtyZXR1cm4gaW9zX2Jhc2U6OmZhaWwoKTt9CisgICAgX0xJQkNQUF9BTFdBWVNfSU5MSU5FIGJvb2wgYmFkKCkgY29uc3QgIHtyZXR1cm4gaW9zX2Jhc2U6OmJhZCgpO30KKworICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSBpb3N0YXRlIGV4Y2VwdGlvbnMoKSBjb25zdCB7cmV0dXJuIGlvc19iYXNlOjpleGNlcHRpb25zKCk7fQorICAgIF9MSUJDUFBfQUxXQVlTX0lOTElORSB2b2lkIGV4Y2VwdGlvbnMoaW9zdGF0ZSBfX2V4Y2VwdCkge2lvc19iYXNlOjpleGNlcHRpb25zKF9fZXhjZXB0KTt9CisKKyAgICAvLyAyNy41LjQuMSBDb25zdHJ1Y3Rvci9kZXN0cnVjdG9yOgorICAgIGV4cGxpY2l0IGJhc2ljX2lvcyhiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLHRyYWl0c190eXBlPiogX19zYik7CisgICAgdmlydHVhbCB+YmFzaWNfaW9zKCk7CisKKyAgICAvLyAyNy41LjQuMiBNZW1iZXJzOgorICAgIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIHRpZSgpIGNvbnN0OworICAgIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIHRpZShiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3RpZXN0cik7CisKKyAgICBiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIHJkYnVmKCkgY29uc3Q7CisgICAgYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiByZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpOworCisgICAgYmFzaWNfaW9zJiBjb3B5Zm10KGNvbnN0IGJhc2ljX2lvcyYgX19yaHMpOworCisgICAgY2hhcl90eXBlIGZpbGwoKSBjb25zdDsKKyAgICBjaGFyX3R5cGUgZmlsbChjaGFyX3R5cGUgX19jaCk7CisKKyAgICBsb2NhbGUgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisKKyAgICBjaGFyIG5hcnJvdyhjaGFyX3R5cGUgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdDsKKyAgICBjaGFyX3R5cGUgd2lkZW4oY2hhciBfX2MpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgYmFzaWNfaW9zKCkgey8vIHB1cnBvc2VmdWxseSBkb2VzIG5vIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgfQorICAgIHZvaWQgaW5pdChiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpOworCisgICAgdm9pZCBtb3ZlKGJhc2ljX2lvcyYgX19yaHMpOworI2lmZGVmIF9MSUJDUFBfTU9WRQorICAgIHZvaWQgbW92ZShiYXNpY19pb3MmJiBfX3Jocykge21vdmUoX19yaHMpO30KKyNlbmRpZgorICAgIHZvaWQgc3dhcChiYXNpY19pb3MmIF9fcmhzKTsKKyAgICB2b2lkIHNldF9yZGJ1ZihiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpOworcHJpdmF0ZToKKyAgICBiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3RpZV87CisgICAgY2hhcl90eXBlIF9fZmlsbF87Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpiYXNpY19pb3MoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSx0cmFpdHNfdHlwZT4qIF9fc2IpCit7CisgICAgaW5pdChfX3NiKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojp+YmFzaWNfaW9zKCkKK3sKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6aW5pdChiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qIF9fc2IpCit7CisgICAgaW9zX2Jhc2U6OmluaXQoX19zYik7CisgICAgX190aWVfID0gMDsKKyAgICBfX2ZpbGxfID0gd2lkZW4oJyAnKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6dGllKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX190aWVfOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgoraW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2Jhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPioKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojp0aWUoYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX190aWVzdHIpCit7CisgICAgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19yID0gX190aWVfOworICAgIF9fdGllXyA9IF9fdGllc3RyOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6cmRidWYoKSBjb25zdAoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4qPihpb3NfYmFzZTo6cmRidWYoKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQorYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6cmRidWYoYmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+KiBfX3NiKQoreworICAgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19yID0gcmRidWYoKTsKKyAgICBpb3NfYmFzZTo6cmRidWYoX19zYik7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitsb2NhbGUKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjppbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQoreworICAgIGxvY2FsZSBfX3IgPSBnZXRsb2MoKTsKKyAgICBpb3NfYmFzZTo6aW1idWUoX19sb2MpOworICAgIGlmIChyZGJ1ZigpKQorICAgICAgICByZGJ1ZigpLT5wdWJpbWJ1ZShfX2xvYyk7CisgICAgcmV0dXJuIF9fcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitjaGFyCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6bmFycm93KGNoYXJfdHlwZSBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0Cit7CisgICAgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxjaGFyX3R5cGU+ID4oZ2V0bG9jKCkpLm5hcnJvdyhfX2MsIF9fZGZhdWx0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfQ2hhclQKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojp3aWRlbihjaGFyIF9fYykgY29uc3QKK3sKKyAgICByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihnZXRsb2MoKSkud2lkZW4oX19jKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfQ2hhclQKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpmaWxsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gX19maWxsXzsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitfQ2hhclQKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpmaWxsKGNoYXJfdHlwZSBfX2NoKQoreworICAgIGNoYXJfdHlwZSBfX3IgPSBfX2ZpbGxfOworICAgIF9fZmlsbF8gPSBfX2NoOworICAgIHJldHVybiBfX3I7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPiYKK2Jhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojpjb3B5Zm10KGNvbnN0IGJhc2ljX2lvcyYgX19yaHMpCit7CisgICAgaWYgKHRoaXMgIT0gJl9fcmhzKQorICAgIHsKKyAgICAgICAgX19jYWxsX2NhbGxiYWNrcyhlcmFzZV9ldmVudCk7CisgICAgICAgIGlvc19iYXNlOjpjb3B5Zm10KF9fcmhzKTsKKyAgICAgICAgX190aWVfID0gX19yaHMuX190aWVfOworICAgICAgICBfX2ZpbGxfID0gX19yaHMuX19maWxsXzsKKyAgICAgICAgX19jYWxsX2NhbGxiYWNrcyhjb3B5Zm10X2V2ZW50KTsKKyAgICAgICAgZXhjZXB0aW9ucyhfX3Jocy5leGNlcHRpb25zKCkpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46Om1vdmUoYmFzaWNfaW9zJiBfX3JocykKK3sKKyAgICBpb3NfYmFzZTo6bW92ZShfX3Jocyk7CisgICAgX190aWVfID0gX19yaHMuX190aWVfOworICAgIF9fcmhzLl9fdGllXyA9IDA7CisgICAgX19maWxsXyA9IF9fcmhzLl9fZmlsbF87Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQordm9pZAorYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46OnN3YXAoYmFzaWNfaW9zJiBfX3JocykKK3sKKyAgICBpb3NfYmFzZTo6c3dhcChfX3Jocyk7CisgICAgX1NURDo6c3dhcChfX3RpZV8sIF9fcmhzLl9fdGllXyk7CisgICAgX1NURDo6c3dhcChfX2ZpbGxfLCBfX3Jocy5fX2ZpbGxfKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCit2b2lkCitiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6c2V0X3JkYnVmKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiogX19zYikKK3sKKyAgICBpb3NfYmFzZTo6c2V0X3JkYnVmKF9fc2IpOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitib29sYWxwaGEoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitub2Jvb2xhbHBoYShpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIudW5zZXRmKGlvc19iYXNlOjpib29sYWxwaGEpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorc2hvd2Jhc2UoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK25vc2hvd2Jhc2UoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnVuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorc2hvd3BvaW50KGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorbm9zaG93cG9pbnQoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK3Nob3dwb3MoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorbm9zaG93cG9zKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci51bnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorc2tpcHdzKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpza2lwd3MpOworICAgIHJldHVybiBfX3N0cjsKK30KKworaW5saW5lIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkKK2lvc19iYXNlJgorbm9za2lwd3MoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnVuc2V0Zihpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK3VwcGVyY2FzZShpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK25vdXBwZXJjYXNlKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci51bnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCit1bml0YnVmKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjp1bml0YnVmKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK25vdW5pdGJ1Zihpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIudW5zZXRmKGlvc19iYXNlOjp1bml0YnVmKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK2ludGVybmFsKGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK2xlZnQoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OmxlZnQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCityaWdodChpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6cmlnaHQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitkZWMoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OmRlYywgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitoZXgoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OmhleCwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitvY3QoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6Om9jdCwgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitmaXhlZChpb3NfYmFzZSYgX19zdHIpCit7CisgICAgX19zdHIuc2V0Zihpb3NfYmFzZTo6Zml4ZWQsIGlvc19iYXNlOjpmbG9hdGZpZWxkKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK3NjaWVudGlmaWMoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnNldGYoaW9zX2Jhc2U6OnNjaWVudGlmaWMsIGlvc19iYXNlOjpmbG9hdGZpZWxkKTsKKyAgICByZXR1cm4gX19zdHI7Cit9CisKK2lubGluZSBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZCitpb3NfYmFzZSYKK2hleGZsb2F0KGlvc19iYXNlJiBfX3N0cikKK3sKKyAgICBfX3N0ci5zZXRmKGlvc19iYXNlOjpmaXhlZCB8IGlvc19iYXNlOjpzY2llbnRpZmljLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitpbmxpbmUgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWQoraW9zX2Jhc2UmCitkZWZhdWx0ZmxvYXQoaW9zX2Jhc2UmIF9fc3RyKQoreworICAgIF9fc3RyLnVuc2V0Zihpb3NfYmFzZTo6ZmxvYXRmaWVsZCk7CisgICAgcmV0dXJuIF9fc3RyOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9JT1MK