From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1CyxHP-0005vt-Tw for qemu-devel@nongnu.org; Wed, 09 Feb 2005 14:13:42 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1CyxHF-0005q8-A4 for qemu-devel@nongnu.org; Wed, 09 Feb 2005 14:13:30 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1CyxHC-0005mj-V6 for qemu-devel@nongnu.org; Wed, 09 Feb 2005 14:13:27 -0500 Received: from [65.117.135.102] (helo=exchange.timesys.com) by monty-python.gnu.org with esmtp (Exim 4.34) id 1CywuN-0004K2-Hj for qemu-devel@nongnu.org; Wed, 09 Feb 2005 13:49:52 -0500 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-T0qSQ8qqDwnv9/Q+GNow" Content-Class: urn:content-classes:message Date: Wed, 09 Feb 2005 13:49:49 -0500 Message-ID: <1107974989.17910.6.camel@jmcmullan> Date: Wed, 9 Feb 2005 13:48:18 -0500 MIME-Version: 1.0 Message-ID: <1107974989.17910.6.camel@jmcmullan> From: "McMullan, Jason" Subject: [Qemu-devel] New emulator: MIPS-user Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org --=-T0qSQ8qqDwnv9/Q+GNow Content-Type: multipart/mixed; boundary="=-gAe26Sb24SVO7CLEhNfz" --=-gAe26Sb24SVO7CLEhNfz Content-Type: text/plain Content-Transfer-Encoding: quoted-printable So, I'm working on converting my pure-emulation mips-user emulator ( http://www.sourceforge.net/projects/gehail ) to QEMU's dynamic code generator system, and I was wondering if there's a document that describes the general architecture, and: a) What PARAM1..PARAM3 are, and where and where not to use them. b) The proper way to use JUMP_TB() c) The rules for creating a proper op.c file d) etc. Attached is the 'mips64.spec' file I'll be using to automatically generate my op.c and translate.c, just so you know that there's real code behind this. --=20 Jason McMullan TimeSys Corporation --=-gAe26Sb24SVO7CLEhNfz Content-Disposition: attachment; filename=mips64.spec Content-Transfer-Encoding: base64 Content-Type: text/plain; name=mips64.spec; charset=ISO-8859-1 DQovKiBBQlMuZm10IEFicyAtIEZsb2F0aW5nIFBvaW50IEFic29sdXRlIFZhbHVlDQogKi8NCg0K MDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBmZCg1KSAwMDAxMDE6DQoJU3RvcmVGUFIoZmQsIGZt dCwgZmxvYXRfYWJzKFZhbHVlRlBSKGZzLCBmbXQpKSk7DQoNCi8qIEFERCBBZGQgV29yZA0KICov DQowMDAwMDAgcnMoNSkgcnQoNSkgcmQoNSkgMDAwMDAgMTAwMDAwOg0KCXVpbnQ2NF90IHRlbXA7 DQoJaWYgKE5vdFdvcmRWYWx1ZShHUFJbcnNdKSB8fCBOb3RXb3JkVmFsdWUoR1BSW3J0XSkgKSB7 DQoJCVVOUFJFRElDVEFCTEU7DQoJfQ0KCXRlbXAgID0gKGJpdChHUFJbcnNdLDMxKSA8PCAzMikg fCBHUFJbcnNdOw0KCXRlbXAgKz0gKGJpdChHUFJbcnRdLDMxKSA8PCAzMikgfCBHUFJbcnRdOw0K CWlmIChiaXQodGVtcCwzMikgIT0gYml0KHRlbXAsMzEpKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihJ bnRlZ2VyT3ZlcmZsb3cpOw0KCX0gZWxzZSB7DQoJCUdQUltyZF0gPSBzaWduX2V4dGVuZCh0ZW1w LCAzMik7DQoJfQ0KDQovKiBBRERJIEFkZCBpbW1lZGlhdGUNCiAqLw0KMDAxMDAwIHJzKDUpIHJ0 KDUpIGltbWVkaWF0ZSgxNik6DQoJdWludDY0X3QgdGVtcDsNCiAJaWYgKE5vdFdvcmRWYWx1ZShH UFJbcnNdKSkgew0KCQlVTlBSRURJQ1RBQkxFOw0KCX0NCgl0ZW1wICA9IChiaXQoR1BSW3JzXSwz MSkgPDwgMzIpIHwgR1BSW3JzXTsNCgl0ZW1wICs9IHNpZ25fZXh0ZW5kKGltbWVkaWF0ZSwxNik7 DQoJaWYgKGJpdCh0ZW1wLDMyKSAhPSBiaXQodGVtcCwzMSkpIHsNCgkJU2lnbmFsRXhjZXB0aW9u KEludGVnZXJPdmVyZmxvdyk7DQoJfSBlbHNlIHsNCgkJR1BSW3J0XSA9IHNpZ25fZXh0ZW5kKHRl bXAsIDMyKTsNCgl9DQoNCi8qIEFERElVIEFkZCBpbW1lZGlhdGUsIHVuc2lnbmVkDQogKi8NCjAw MTAwMSBycyg1KSBydCg1KSBpbW1lZGlhdGUoMTYpOg0KCXVpbnQ2NF90IHRlbXA7DQogCWlmIChO b3RXb3JkVmFsdWUoR1BSW3JzXSkpIHsNCgkJVU5QUkVESUNUQUJMRTsNCgl9DQoJdGVtcCA9IEdQ Ultyc10gKyBzaWduX2V4dGVuZChpbW1lZGlhdGUsIDE2KTsNCglHUFJbcnRdID0gc2lnbl9leHRl bmQodGVtcCwgMzIpOw0KDQovKiBBRERVIEFkZCB1bnNpZ25lZCB3b3JkDQogKi8NCjAwMDAwMCBy cyg1KSBydCg1KSByZCg1KSAwMDAwMCAxMDAwMDE6DQoJdWludDY0X3QgdGVtcDsNCglpZiAoTm90 V29yZFZhbHVlKEdQUltyc10pIHx8IE5vdFdvcmRWYWx1ZShHUFJbcnRdKSkgew0KCQlVTlBSRURJ Q1RBQkxFOw0KCX0NCgl0ZW1wID0gR1BSW3JzXSArIEdQUltydF07DQoJR1BSW3JkXSA9IHNpZ25f ZXh0ZW5kKHRlbXAsIDMyKTsNCg0KLyogQUxOVi5QUyBGbG9hdGluZyBwb2ludCBhbGlnbg0KICov DQowMTAwMTEgcnMoNSkgZnQoNSkgZnMoNSkgZmQoNSkgMDExMTEwOg0KCWlmIChiaXRzKEdQUlty c10sMCwyKSA9PSAwKSB7DQoJCVN0b3JlRlBSKGZkLCBQUywgVmFsdWVGUFIoZmQsIFBTKSk7DQoJ fSBlbHNlIGlmIChiaXRzKEdQUltyc10sMCwyKSAhPSA0KSB7DQoJCVVOUFJFRElDVEFCTEU7DQoJ fSBlbHNlIGlmIChCaWdFbmRpYW5DUFUpIHsNCgkJU3RvcmVGUFIoZmQsIFBTLCAoYml0cyhWYWx1 ZUZQUihmcywgUFMpLDAsMzEpIDw8IDMyKSB8IGJpdHMoVmFsdWVGUFIoZnQsIFBTKSwgMzIsIDYz KSk7DQoJfSBlbHNlIHsNCgkJU3RvcmVGUFIoZmQsIFBTLCAoYml0cyhWYWx1ZUZQUihmdCwgUFMp LDAsMzEpIDw8IDMyKSB8IGJpdHMoVmFsdWVGUFIoZnMsIFBTKSwgMzIsIDYzKSk7DQoJfQ0KDQov KiBBTkQgQW5kDQogKi8NCjAwMDAwMCBycyg1KSBydCg1KSByZCg1KSAwMDAwMCAxMDAxMDA6DQoJ R1BSW3JkXSA9IEdQUltyc10gJiBHUFJbcnRdOw0KDQovKiBBTkRJIEFuZCBJbW1lZGlhdGUNCiAq Lw0KMDAxMTAwIHJzKDUpIHJ0KDUpIGltbWVkaWF0ZSgxNik6DQoJR1BSW3J0XSA9IEdQUltyc10g JiB6ZXJvX2V4dGVuZChpbW1lZGlhdGUsIDE2KTsNCg0KLyogQiBVbmNvbmRpdGlvbmFsIGJyYW5j aA0KICovDQowMDAxMDAgMDAwMDAgMDAwMDAgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB0YXJnZXRf b2Zmc2V0Ow0KCS8qIEk6ICovICAgdGFyZ2V0X29mZnNldCA9IHNpZ25fZXh0ZW5kKG9mZnNldCA8 PCAyLCAxOCk7DQoJTmV4dEluc3RydWN0aW9uKCk7DQoJLyogSSsxOiAqLyBQQyA9IFBDICsgdGFy Z2V0X29mZnNldCAtIDQ7DQoNCi8qIEJBTCBCcmFuY2ggYW5kIExpbmsNCiAqLw0KMDAwMDAxIDAw MDAwIDEwMDAxIG9mZnNldCgxNik6DQoJdWludDY0X3QgdGFyZ2V0X29mZnNldDsNCgkvKiBJOiAq LyAgIHRhcmdldF9vZmZzZXQgPSBzaWduX2V4dGVuZChvZmZzZXQgPDwgMiwgMTgpOw0KCSAgICAg ICAgICAgR1BSWzMxXSA9IFBDICsgNDsNCglOZXh0SW5zdHJ1Y3Rpb24oKTsNCgkvKiBJKzE6ICov IFBDID0gUEMgKyB0YXJnZXRfb2Zmc2V0IC0gNDsNCg0KLyogQkMxRi9UIEJyYW5jaCBvbiBGUCBG YWxzZS9UcnVlDQogKi8NCjAxMDAwMSAwMTAwMCBjYygzKSAwIHRmKDEpIG9mZnNldCgxNik6DQoJ dWludDY0X3QgdGFyZ2V0X29mZnNldDsNCglpbnQgY29uZGl0aW9uOw0KCS8qIEk6ICovICAgY29u ZGl0aW9uPUZQQ29uZGl0aW9uQ29kZShjYykgPT0gdGY7DQoJCSAgIHRhcmdldF9vZmZzZXQgPSBz aWduX2V4dGVuZChvZmZzZXQgPDwgMiwgMTgpOw0KCU5leHRJbnN0cnVjdGlvbigpOw0KCS8qIEkr MTogKi8gaWYgKGNvbmRpdGlvbikgew0KCQkJUEMgPSBQQyArIHRhcmdldF9vZmZzZXQgLSA0Ow0K CQkgICB9DQoNCi8qIEJDMUYvVEwgQnJhbmNoIG9uIEZQIEZhbHNlL1RydWUgTGlrZWx5DQogKi8N CjAxMDAwMSAwMTAwMCBjYygzKSAxIHRmKDEpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdGFyZ2V0 X29mZnNldDsNCglpbnQgY29uZGl0aW9uOw0KCS8qIEk6ICovICAgY29uZGl0aW9uPUZQQ29uZGl0 aW9uQ29kZShjYykgPT0gdGY7DQoJCSAgIHRhcmdldF9vZmZzZXQgPSBzaWduX2V4dGVuZChvZmZz ZXQgPDwgMiwgMTgpOw0KCS8qIEkrMTogKi8gaWYgKGNvbmRpdGlvbikgew0KCQkJTmV4dEluc3Ry dWN0aW9uKCk7DQoJCQlQQyA9IFBDICsgdGFyZ2V0X29mZnNldCAtIDQ7DQoJCSAgIH0NCg0KLyog QkMyRi9UIEJyYW5jaCBvbiBDT1AyIEZhbHNlL1RydWUNCiAqLw0KMDEwMDEwIDAxMDAwIGNjKDMp IDAgdGYoMSkgb2Zmc2V0KDE2KToNCglTaWduYWxFeGNlcHRpb24oVW5pbXBsZW1lbnRlZCk7DQoN Ci8qIEJDMkYvVEwgQnJhbmNoIG9uIENPUDIgRmFsc2UvVHJ1ZSBMaWtlbHkNCiAqLw0KMDEwMDAx IDAxMDAwIGNjKDMpIDEgdGYoMSkgb2Zmc2V0KDE2KToNCglTaWduYWxFeGNlcHRpb24oVW5pbXBs ZW1lbnRlZCk7DQoNCi8qIEJFUSBCcmFuY2ggb24gRXF1YWwNCiAqLw0KMDAwMTAwIHJzKDUpIHJ0 KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdGFyZ2V0X29mZnNldDsNCglpbnQgY29uZGl0aW9u Ow0KCS8qIEk6ICovICAgY29uZGl0aW9uID0gKEdQUltyc10gPT0gR1BSW3J0XSk7DQoJICAgICAg ICAgICB0YXJnZXRfb2Zmc2V0ID0gc2lnbl9leHRlbmQob2Zmc2V0IDw8IDIsIDE4KTsNCglOZXh0 SW5zdHJ1Y3Rpb24oKTsNCgkvKiBJKzE6ICovIGlmIChjb25kaXRpb24pIHsNCgkJCVBDID0gUEMg KyB0YXJnZXRfb2Zmc2V0IC0gNDsNCgkJICAgfQ0KDQovKiBCRVFMIGJyYW5jaCBvbiBFcXVhbCBM aWtlbHkNCiAqLw0KMDEwMTAwIHJzKDUpIHJ0KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdGFy Z2V0X29mZnNldDsNCglpbnQgY29uZGl0aW9uOw0KCS8qIEk6ICovICAgY29uZGl0aW9uID0gKEdQ Ultyc10gPT0gR1BSW3J0XSk7DQoJCSAgIHRhcmdldF9vZmZzZXQgPSBzaWduX2V4dGVuZChvZmZz ZXQgPDwgMiwgMTgpOw0KCS8qIEkrMTogKi8gaWYgKGNvbmRpdGlvbikgew0KCQkJTmV4dEluc3Ry dWN0aW9uKCk7DQoJCQlQQyA9IFBDICsgdGFyZ2V0X29mZnNldCAtIDQ7DQoJCSAgIH0NCg0KLyog QkdFWiBCcmFuY2ggb24gRXF1YWwgb3IgR3JlYXRlciBUaGFuIFplcm8NCiAqLw0KMDAwMDAxIHJz KDUpIDAwMDAxIG9mZnNldCgxNik6DQoJdWludDY0X3QgdGFyZ2V0X29mZnNldDsNCglpbnQgY29u ZGl0aW9uOw0KCS8qIEk6ICovICAgY29uZGl0aW9uID0gKChpbnQ2NF90KUdQUltyc10gPj0gMCk7 DQoJICAgICAgICAgICB0YXJnZXRfb2Zmc2V0ID0gc2lnbl9leHRlbmQob2Zmc2V0IDw8IDIsIDE4 KTsNCglOZXh0SW5zdHJ1Y3Rpb24oKTsNCgkvKiBJKzE6ICovIGlmIChjb25kaXRpb24pIHsNCgkJ CVBDID0gUEMgKyB0YXJnZXRfb2Zmc2V0IC0gNDsNCgkJICAgfQ0KDQovKiBCR0VaTCBCcmFuY2gg b24gRXF1YWwgb3IgR3JlYXRlciBUaGFuIFplcm8gTGlrZWx5DQogKi8NCjAwMDAwMSBycyg1KSAw MDAxMSBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHRhcmdldF9vZmZzZXQ7DQoJaW50IGNvbmRpdGlv bjsNCgkvKiBJOiAqLyAgIGNvbmRpdGlvbiA9ICgoaW50NjRfdClHUFJbcnNdID49IDApOw0KCSAg ICAgICAgICAgdGFyZ2V0X29mZnNldCA9IHNpZ25fZXh0ZW5kKG9mZnNldCA8PCAyLCAxOCk7DQoJ LyogSSsxOiAqLyBpZiAoY29uZGl0aW9uKSB7DQoJCQlOZXh0SW5zdHJ1Y3Rpb24oKTsNCgkJCVBD ID0gUEMgKyB0YXJnZXRfb2Zmc2V0IC0gNDsNCgkJICAgfQ0KDQovKiBCR0VaQUwgQnJhbmNoIG9u IGdyZWF0ZXIgVGhhbiBvciBFcXVhbCB0byBaZXJvIGFuZCBMaW5rDQogKi8NCjAwMDAwMSBycyg1 KSAxMDAwMSBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHRhcmdldF9vZmZzZXQ7DQoJaW50IGNvbmRp dGlvbjsNCgkvKiBJOiAqLyAgIGNvbmRpdGlvbiA9ICgoaW50NjRfdClHUFJbcnNdID49IDApOw0K CSAgICAgICAgICAgdGFyZ2V0X29mZnNldCA9IHNpZ25fZXh0ZW5kKG9mZnNldCA8PCAyLCAxOCk7 DQoJCSAgIEdQUlszMV0gPSBQQyArIDQ7DQoJTmV4dEluc3RydWN0aW9uKCk7DQoJLyogSSsxOiAq LyBpZiAoY29uZGl0aW9uKSB7DQoJCQlQQyA9IFBDICsgdGFyZ2V0X29mZnNldCAtIDQ7DQoJCSAg IH0NCg0KDQovKiBCR0VaQUxMIEJyYW5jaCBvbiBncmVhdGVyIFRoYW4gb3IgRXF1YWwgdG8gWmVy byBhbmQgTGluayBMaWtlbHkNCiAqLw0KMDAwMDAxIHJzKDUpIDEwMDExIG9mZnNldCgxNik6DQoJ dWludDY0X3QgdGFyZ2V0X29mZnNldDsNCglpbnQgY29uZGl0aW9uOw0KCS8qIEk6ICovICAgY29u ZGl0aW9uID0gKChpbnQ2NF90KUdQUltyc10gPj0gMCk7DQoJICAgICAgICAgICB0YXJnZXRfb2Zm c2V0ID0gc2lnbl9leHRlbmQob2Zmc2V0IDw8IDIsIDE4KTsNCgkJICAgR1BSWzMxXSA9IFBDICsg NDsNCgkvKiBJKzE6ICovIGlmIChjb25kaXRpb24pIHsNCgkJCU5leHRJbnN0cnVjdGlvbigpOw0K CQkJUEMgPSBQQyArIHRhcmdldF9vZmZzZXQgLSA0Ow0KCQkgICB9DQoNCg0KLyogQkdUWiBCcmFu Y2ggb24gR3JlYXRlciBUaGFuIFplcm8NCiAqLw0KMDAwMTExIHJzKDUpIDAwMDAwIG9mZnNldCgx Nik6DQoJdWludDY0X3QgdGFyZ2V0X29mZnNldDsNCglpbnQgY29uZGl0aW9uOw0KCS8qIEk6ICov ICAgY29uZGl0aW9uID0gKChpbnQ2NF90KUdQUltyc10gPiAwKTsNCgkgICAgICAgICAgIHRhcmdl dF9vZmZzZXQgPSBzaWduX2V4dGVuZChvZmZzZXQgPDwgMiwgMTgpOw0KCU5leHRJbnN0cnVjdGlv bigpOw0KCS8qIEkrMTogKi8gaWYgKGNvbmRpdGlvbikgew0KCQkJUEMgPSBQQyArIHRhcmdldF9v ZmZzZXQgLSA0Ow0KCQkgICB9DQoNCi8qIEJHVFpMIEJyYW5jaCBvbiBHcmVhdGVyIFRoYW4gWmVy byBMaWtlbHkNCiAqLw0KMDEwMTExIHJzKDUpIDAwMDAwIG9mZnNldCgxNik6DQoJdWludDY0X3Qg dGFyZ2V0X29mZnNldDsNCglpbnQgY29uZGl0aW9uOw0KCS8qIEk6ICovICAgY29uZGl0aW9uID0g KChpbnQ2NF90KUdQUltyc10gPiAwKTsNCgkgICAgICAgICAgIHRhcmdldF9vZmZzZXQgPSBzaWdu X2V4dGVuZChvZmZzZXQgPDwgMiwgMTgpOw0KCS8qIEkrMTogKi8gaWYgKGNvbmRpdGlvbikgew0K CQkJTmV4dEluc3RydWN0aW9uKCk7DQoJCQlQQyA9IFBDICsgdGFyZ2V0X29mZnNldCAtIDQ7DQoJ CSAgIH0NCg0KLyogQkxFWiBCcmFuY2ggb24gTGVzcyBUaGFuIG9yIEVxdWFsIHRvIFplcm8NCiAq Lw0KMDAwMTEwIHJzKDUpIDAwMDAwIG9mZnNldCgxNik6DQoJdWludDY0X3QgdGFyZ2V0X29mZnNl dDsNCglpbnQgY29uZGl0aW9uOw0KCS8qIEk6ICovICAgY29uZGl0aW9uID0gKChpbnQ2NF90KUdQ Ultyc10gPD0gMCk7DQoJICAgICAgICAgICB0YXJnZXRfb2Zmc2V0ID0gc2lnbl9leHRlbmQob2Zm c2V0IDw8IDIsIDE4KTsNCglOZXh0SW5zdHJ1Y3Rpb24oKTsNCgkvKiBJKzE6ICovIGlmIChjb25k aXRpb24pIHsNCgkJCVBDID0gUEMgKyB0YXJnZXRfb2Zmc2V0IC0gNDsNCgkJICAgfQ0KDQovKiBC TEVaTCBCcmFuY2ggb24gTGVzcyBUaGFuIG9yIEVxdWFsIHRvIFplcm8gTGlrZWx5DQogKi8NCjAx MDExMCBycyg1KSAwMDAwMCBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHRhcmdldF9vZmZzZXQ7DQoJ aW50IGNvbmRpdGlvbjsNCgkvKiBJOiAqLyAgIGNvbmRpdGlvbiA9ICgoaW50NjRfdClHUFJbcnNd IDw9IDApOw0KCSAgICAgICAgICAgdGFyZ2V0X29mZnNldCA9IHNpZ25fZXh0ZW5kKG9mZnNldCA8 PCAyLCAxOCk7DQoJLyogSSsxOiAqLyBpZiAoY29uZGl0aW9uKSB7DQoJCQlOZXh0SW5zdHJ1Y3Rp b24oKTsNCgkJCVBDID0gUEMgKyB0YXJnZXRfb2Zmc2V0IC0gNDsNCgkJICAgfQ0KDQovKiBCTFRa IEJyYW5jaCBvbiBMZXNzIFRoYW4gWmVybw0KICovDQowMDAwMDEgcnMoNSkgMDAwMDAgb2Zmc2V0 KDE2KToNCgl1aW50NjRfdCB0YXJnZXRfb2Zmc2V0Ow0KCWludCBjb25kaXRpb247DQoJLyogSTog Ki8gICBjb25kaXRpb24gPSAoKGludDY0X3QpR1BSW3JzXSA8IDApOw0KCSAgICAgICAgICAgdGFy Z2V0X29mZnNldCA9IHNpZ25fZXh0ZW5kKG9mZnNldCA8PCAyLCAxOCk7DQoJTmV4dEluc3RydWN0 aW9uKCk7DQoJLyogSSsxOiAqLyBpZiAoY29uZGl0aW9uKSB7DQoJCQlQQyA9IFBDICsgdGFyZ2V0 X29mZnNldCAtIDQ7DQoJCSAgIH0NCg0KLyogQkxUWkwgQnJhbmNoIG9uIExlc3MgVGhhbiBaZXJv IExpa2VseQ0KICovDQowMDAwMDEgcnMoNSkgMDAwMTAgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB0 YXJnZXRfb2Zmc2V0Ow0KCWludCBjb25kaXRpb247DQoJLyogSTogKi8gICBjb25kaXRpb24gPSAo KGludDY0X3QpR1BSW3JzXSA8IDApOw0KCSAgICAgICAgICAgdGFyZ2V0X29mZnNldCA9IHNpZ25f ZXh0ZW5kKG9mZnNldCA8PCAyLCAxOCk7DQoJLyogSSsxOiAqLyBpZiAoY29uZGl0aW9uKSB7DQoJ CQlOZXh0SW5zdHJ1Y3Rpb24oKTsNCgkJCVBDID0gUEMgKyB0YXJnZXRfb2Zmc2V0IC0gNDsNCgkJ ICAgfQ0KDQovKiBCTFRaQUwgQnJhbmNoIG9uIExlc3MgVGhhbiBaZXJvIGFuZCBMaW5rDQogKi8N CjAwMDAwMSBycyg1KSAxMDAwMCBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHRhcmdldF9vZmZzZXQ7 DQoJaW50IGNvbmRpdGlvbjsNCgkvKiBJOiAqLyAgIGNvbmRpdGlvbiA9ICgoaW50NjRfdClHUFJb cnNdIDwgMCk7DQoJICAgICAgICAgICB0YXJnZXRfb2Zmc2V0ID0gc2lnbl9leHRlbmQob2Zmc2V0 IDw8IDIsIDE4KTsNCgkJICAgR1BSWzMxXSA9IFBDICsgNDsNCglOZXh0SW5zdHJ1Y3Rpb24oKTsN CgkvKiBJKzE6ICovIGlmIChjb25kaXRpb24pIHsNCgkJCVBDID0gUEMgKyB0YXJnZXRfb2Zmc2V0 IC0gNDsNCgkJICAgfQ0KDQoNCi8qIEJMVFpBTEwgQnJhbmNoIG9uIExlc3MgVGhhbiBaZXJvIGFu ZCBMaW5rIExpa2VseQ0KICovDQowMDAwMDEgcnMoNSkgMTAwMTAgb2Zmc2V0KDE2KToNCgl1aW50 NjRfdCB0YXJnZXRfb2Zmc2V0Ow0KCWludCBjb25kaXRpb247DQoJLyogSTogKi8gICBjb25kaXRp b24gPSAoKGludDY0X3QpR1BSW3JzXSA8IDApOw0KCSAgICAgICAgICAgdGFyZ2V0X29mZnNldCA9 IHNpZ25fZXh0ZW5kKG9mZnNldCA8PCAyLCAxOCk7DQoJCSAgIEdQUlszMV0gPSBQQyArIDQ7DQoJ LyogSSsxOiAqLyBpZiAoY29uZGl0aW9uKSB7DQoJCQlOZXh0SW5zdHJ1Y3Rpb24oKTsNCgkJCVBD ID0gUEMgKyB0YXJnZXRfb2Zmc2V0IC0gNDsNCgkJICAgfQ0KDQovKiBCTkUgQnJhbmNoIG9uIE5v dCBFcXVhbA0KICovDQowMDAxMDEgcnMoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB0 YXJnZXRfb2Zmc2V0Ow0KCWludCBjb25kaXRpb247DQoJLyogSTogKi8gICBjb25kaXRpb24gPSAo R1BSW3JzXSAhPSBHUFJbcnRdKTsNCgkgICAgICAgICAgIHRhcmdldF9vZmZzZXQgPSBzaWduX2V4 dGVuZChvZmZzZXQgPDwgMiwgMTgpOw0KCU5leHRJbnN0cnVjdGlvbigpOw0KCS8qIEkrMTogKi8g aWYgKGNvbmRpdGlvbikgew0KCQkJUEMgPSBQQyArIHRhcmdldF9vZmZzZXQgLSA0Ow0KCQkgICB9 DQoNCi8qIEJORUwgQnJhbmNoIG9uIE5vdCBFcXVhbCBMaWtlbHkNCiAqLw0KMDEwMTAxIHJzKDUp IHJ0KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdGFyZ2V0X29mZnNldDsNCglpbnQgY29uZGl0 aW9uOw0KCS8qIEk6ICovICAgY29uZGl0aW9uID0gKEdQUltyc10gIT0gR1BSW3J0XSk7DQoJCSAg IHRhcmdldF9vZmZzZXQgPSBzaWduX2V4dGVuZChvZmZzZXQgPDwgMiwgMTgpOw0KCS8qIEkrMTog Ki8gaWYgKGNvbmRpdGlvbikgew0KCQkJTmV4dEluc3RydWN0aW9uKCk7DQoJCQlQQyA9IFBDICsg dGFyZ2V0X29mZnNldCAtIDQ7DQoJCSAgIH0NCg0KLyogQlJFQUsgQnJlYWtwb2ludA0KICovDQow MDAwMDAgY29kZSgyMCkgMDAxMTAxOg0KCVNpZ25hbEV4Y2VwdGlvbihCcmVha3BvaW50KTsNCg0K LyogQy5jb25kLmZtdCBGbG9hdGluZyBQb2ludCBDb21wYXJlDQogKi8NCjAxMDAwMSBmbXQoNSkg ZnQoNSkgZnMoNSkgY2MoMykgMCAwIDExIGNvbmQoNCk6DQoJaW50IGxlc3MsIGVxdWFsLCB1bm9y ZGVyZWQsIGNvbmRpdGlvbjsNCglpZiAoU05hTihWYWx1ZUZQUihmcywgZm10KSkgfHwgU05hTihW YWx1ZUZQUihmdCwgZm10KSkgfHwNCgkgICAgUU5hTihWYWx1ZUZQUihmcywgZm10KSkgfHwgUU5h TihWYWx1ZUZQUihmdCwgZm10KSkpIHsNCgkJbGVzcyA9IDA7DQoJCWVxdWFsID0gMDsNCgkJdW5v cmRlcmVkID0gMTsNCgkJaWYgKFNOYU4oVmFsdWVGUFIoZnMsZm10KSkgfHwgU05hTihWYWx1ZUZQ UihmdCwgZm10KSkgfHwNCgkJICAgIChiaXQoY29uZCwzKSAmJiAoUU5hTihWYWx1ZUZQUihmcywg Zm10KSB8fCBRTmFOKFZhbHVlRlBSKGZ0LCBmbXQpKSkpKSkgew0KCQkgICAgU2lnbmFsRXhjZXB0 aW9uKEludmFsaWRPcGVyYXRpb24pOw0KCQl9DQoJfSBlbHNlIHsNCgkJbGVzcyA9IGZsb2F0X2xl c3NfdGhhbihWYWx1ZUZQUihmcywgZm10KSxWYWx1ZUZQUihmdCwgZm10KSk7DQoJCWVxdWFsID0g ZmxvYXRfZXF1YWxfdG8oVmFsdWVGUFIoZnMsIGZtdCksVmFsdWVGUFIoZnQsIGZtdCkpOw0KCQl1 bm9yZGVyZWQgPSAwOw0KCX0NCgljb25kaXRpb24gPSAoYml0KGNvbmQsMikgJiYgbGVzcykgfHwg KGJpdChjb25kLDEpICYmIGVxdWFsKSB8fCANCgkgICAgICAgICAgICAoYml0KGNvbmQsMCkgJiYg dW5vcmRlcmVkKTsNCglTZXRGUENvbmRpdGlvbkNvZGUoY29uZGl0aW9uKTsNCg0KLyogQ0FDSEUg UGVyZm9ybSBDYWNoZSBPcGVyYXRpb24NCiAqLw0KMTAxMTExIGJhc2UoNSkgb3AoNSkgb2Zmc2V0 KDE2KToNCgl1aW50NjRfdCB2QWRkcjsNCgl2QWRkciA9IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5k KG9mZnNldCwgMTYpOw0KCS8qIChwQWRkciwgdW5jYWNoZWQpID0gQWRkcmVzc1RyYW5zbGF0aW9u KHZBZGRyLCBEYXRhUmVhZFJlZmVyZW5jZSk7ICovDQoJLyogQ2FjaGVPcChvcCwgdkFkZHIsIHBB ZGRyKTsgKi8NCg0KLyogQ0VJTC5MLmZtdCBGaXhlZCBQb2ludCBDZWlsaW5nIENvbnZlcnQgdG8g TG9uZyBGaXhlZCBQb2ludA0KICovDQowMTAwMDEgZm10KDUpIDAwMDAwIGZzKDUpIGZkKDUpIDAw MTAxMDoNCglTdG9yZUZQUihmZCwgTCwgQ29udmVydEZtdChWYWx1ZUZQUihmcywgZm10KSwgZm10 LCBMKSk7DQoNCi8qIENFSUwuVy5mbXQgRmxvYXRpbmcgUG9pbnQgQ2VpbGluZyBDb252ZXJ0IHRv IFdvcmQgRml4ZWQgUG9pbnQNCiAqLw0KMDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBmZCg1KSAw MDExMTA6DQoJU3RvcmVGUFIoZmQsIFcsIENvbnZlcnRGbXQoVmFsdWVGUFIoZnMsIGZtdCksIGZt dCwgVykpOw0KDQovKiBDRkMxIE1vdmUgQ29udHJvbCBXb3JkIEZyb20gRmxvYXRpbmcgUG9pbnQN CiAqIFRoaXMgaGFzIHRvIGJlIGJlZm9yZSBBREQuZm10Lg0KICovDQowMTAwMDEgMDAwMTAgcnQo NSkgZnMoNSkgMDAwMDAgMDAwMDAwOg0KCXVpbnQzMl90IHRlbXA7DQoJaWYgKGZzID09IDApIHsN CgkJdGVtcCA9IEZJUjsNCgl9IGVsc2UgaWYgKGZzID09IDI1KSB7DQoJCXRlbXAgPSAoYml0cyhG Q1NSLDI1LDMxKSA8PCAxKSB8IGJpdChGQ1NSLDIzKTsNCgl9IGVsc2UgaWYgKGZzID09IDI2KSB7 DQoJCXRlbXAgPSAoYml0cyhGQ1NSLDEyLDE3KSA8PCAxMikgfCAoYml0cyhGQ1NSLDIsNikgPDwg Mik7DQoJfSBlbHNlIGlmIChmcyA9PSAyOCkgew0KCQl0ZW1wID0gKGJpdHMoRkNTUiw3LDExKSA8 PCA3KSB8IChiaXQoRkNTUiwyNCkgPDwgMikgfCBiaXRzKEZDU1IsMCwxKTsNCgl9IGVsc2UgaWYg KGZzID09IDMxKSB7DQoJCXRlbXAgPSBGQ1NSOw0KCX0gZWxzZSB7DQoJCXRlbXAgPSAwOw0KCX0N CglHUFJbcnRdID0gc2lnbl9leHRlbmQodGVtcCwgMzIpOw0KDQovKiBDRkMyIE1vdmUgQ29udHJv bCBXb3JkIEZyb20gQ29wcm9jZXNzb3IgMg0KICovDQowMTAwMTAgMDAwMTAgcnQoNSkgSW1wbCgx Nik6DQoJLyogR1BSW3J0XSA9IHNpZ25fZXh0ZW5kKENQMkNDUltJbXBsXSwgMzIpOyAqLw0KCUdQ UltydF0gPSAwOw0KDQovKiBDTE8vWiBDb3VudCBMZWFkaW5nIE9uZXMvWmVyb3MgaW4gV29yZA0K ICovDQowMTExMDAgcnMoNSkgcnQoNSkgcmQoNSkgMDAwMDAgMTAwMDAgb25lX3plcm8oMSk6DQoJ aW50IHRlbXAsIGk7DQoJaWYgKE5vdFdvcmRWYWx1ZShHUFJbcnNdKSkgew0KCQlVTlBSRURJQ1RB QkxFOw0KCX0NCgl0ZW1wID0gMzI7DQoJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7DQoJCWlm IChiaXQoR1BSW3JzXSxpKSAhPSBvbmVfemVybykgew0KCQkJdGVtcCA9IDMxIC0gaTsNCgkJCWJy ZWFrOw0KCQl9DQoJfQ0KCUdQUltyZF0gPSB0ZW1wOw0KDQovKiBDT1AyIENvcHJvY2Vzc29yIE9w ZXJhdGlvbiB0byBDb3Byb2Nlc3NvciAyDQogKi8NCjAxMDAxMCAxIGNvZnVuKDI1KTogDQoJU2ln bmFsRXhjZXB0aW9uKFVuaW1wbGVtZW50ZWQpOw0KDQovKiBDVEMxIE1vdmUgQ29udHJvbCBXb3Jk IFRvIEZsb2F0aW5nIFBvaW50DQogKi8NCjAxMDAwMSAwMDExMCBydCg1KSBmcyg1KSAwMDAwMCAw MDAwMDA6DQoJdWludDMyX3QgdGVtcDsNCgl0ZW1wPWJpdHMoR1BSW3J0XSwwLDMxKTsNCglpZiAo ZnMgPT0gMjUpIHsNCgkJaWYgKGJpdHModGVtcCw4LDMxKSAhPSAwKSB7DQoJCQlVTlBSRURJQ1RB QkxFOw0KCQl9IGVsc2Ugew0KCQkJRkNTUiA9IChiaXRzKHRlbXAsMSw3KSA8PCAyNSkgfCAoYml0 KEZDU1IsMjQpIDw8IDI0KSB8IChiaXQodGVtcCwwKSA8PCAyMykgfCBiaXRzKEZDU1IsMCwyMik7 DQoJCX0NCgl9IGVsc2UgaWYgKGZzID09IDI2KSB7DQoJCWlmIChiaXRzKHRlbXAsMTgsMjIpICE9 IDApIHsNCgkJCVVOUFJFRElDVEFCTEU7DQoJCX0gZWxzZSB7DQoJCQlGQ1NSID0gKGJpdHMoRkNT UiwxOCwzMSkgPDwgMTgpIHwgKGJpdHModGVtcCwxMiwxNykgPDwgMTIpIHwgKGJpdHMoRkNTUiw3 LDExKSA8PCA3KSB8IChiaXRzKHRlbXAsMiw2KSA8PCAyKSB8IGJpdHMoRkNTUiwwLDEpOw0KCQl9 DQoJfSBlbHNlIGlmIChmcyA9PSAyOCkgew0KCQlpZiAoYml0cyh0ZW1wLDE4LDIyKSAhPSAwKSB7 DQoJCQlVTlBSRURJQ1RBQkxFOw0KCQl9IGVsc2Ugew0KCQkJRkNTUiA9IChiaXRzKEZDU1IsMjUs MzEpIDw8IDI1KSB8IChiaXQodGVtcCwyKSA8PCAyNCkgfCAoYml0cyhGQ1NSLDEyLDIzKSA8PCAx MikgfCAoYml0cyh0ZW1wLDcsMTEpIDw8IDcpIHwgKGJpdHMoRkNTUiwyLDYpIDw8IDIpIHwgYml0 cyh0ZW1wLDAsMSk7DQoJCX0NCgl9IGVsc2UgaWYgKGZzID09IDMxKSB7DQoJCWlmIChiaXRzKHRl bXAsMTgsMjIpICE9IDApIHsNCgkJCVVOUFJFRElDVEFCTEU7DQoJCX0gZWxzZSB7DQoJCQlGQ1NS ID0gdGVtcDsNCgkJfQ0KCX0gZWxzZSB7DQoJCVVOUFJFRElDVEFCTEU7DQoJfQ0KDQovKiBDVEMy IE1vdmUgQ29udHJvbCBXb3JkIHRvIENvcHJvY2Vzc29yIDINCiAqLw0KMDEwMDEwIDAwMTEwIHJ0 KDUpIEltcGwoMTYpOg0KCS8qIENQMkNDUltJbXBsXSA9IGJpdHMoR1BSW3J0XSwwLDMxKTsgKi8N Cg0KLyogQ1ZULkQuZm10IEZsb2F0aW5nIFBvaW50IENvbnZlcnQgdG8gRG91YmxlIEZsb2F0aW5n IFBvaW50DQogKi8NCjAxMDAwMSBmbXQoNSkgMDAwMDAgZnMoNSkgZmQoNSkgMTAwMDAxOg0KCVN0 b3JlRlBSKGZkLCBELCBDb252ZXJ0Rm10KFZhbHVlRlBSKGZzLCBmbXQpLCBmbXQsIEQpKTsNCg0K LyogQ1ZULkwuZm10IEZsb2F0aW5nIFBvaW50IENvbnZlcnQgdG8gTG9uZyBGaXhlZCBGb3JtYXQg DQogKi8NCjAxMDAwMSBmbXQoNSkgMDAwMDAgZnMoNSkgZmQoNSkgMTAwMTAxOg0KCVN0b3JlRlBS KGZkLCBMLCBDb252ZXJ0Rm10KFZhbHVlRlBSKGZzLCBmbXQpLCBmbXQsIEwpKTsNCg0KLyogQ1ZU LlBTLlMgRmxvYXRpbmcgUG9pbnQgQ29udmVydCBQYWlyIHRvIFBhaXJlZCBTaW5nbGUNCiAqLw0K MDEwMDAxIDEwMDAwIGZ0KDUpIGZzKDUpIGZkKDUpIDEwMDExMDoNCglTdG9yZUZQUihmZCwgUywg KFZhbHVlRlBSKGZzLCBTKSA8PCAzMikgfCBWYWx1ZUZQUihmdCwgUykpOw0KDQovKiBDVlQuUy5m bXQgRmxvYXRpbmcgUG9pbnQgQ29udmVydCB0byBTaW5nbGUgRmxvYXRpbmcgUG9pbnQNCiAqLw0K MDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBmZCg1KSAxMDAwMDA6DQoJU3RvcmVGUFIoZmQsIFMs IENvbnZlcnRGbXQoVmFsdWVGUFIoZnMsIGZtdCksIGZtdCwgUykpOw0KDQovKiBDVlQuUy5QTCBG bG9hdGluZyBQb2ludCBDb252ZXJ0IFBhaXIgTG93ZXIgdG8gU2luZ2xlIEZsb2F0aW5nIFBvaW50 DQogKi8NCjAxMDAwMSAxMDExMCAwMDAwMCBmcyg1KSBmZCg1KSAxMDEwMDA6DQoJU3RvcmVGUFIo ZmQsIFMsIENvbnZlcnRGbXQoVmFsdWVGUFIoZnMsIFBTKSwgUEwsIFMpKTsNCg0KLyogQ1ZULlMu UFUgRmxvYXRpbmcgUG9pbnQgQ29udmVydCBQYWlyIFVwcGVyIHRvIFNpbmdsZSBGbG9hdGluZyBQ b2ludA0KICovDQowMTAwMDEgMTAxMTAgMDAwMDAgZnMoNSkgZmQoNSkgMTAwMDAwOg0KCVN0b3Jl RlBSKGZkLCBTLCBDb252ZXJ0Rm10KFZhbHVlRlBSKGZzLCBQUyksIFBVLCBTKSk7DQoNCi8qIENW VC5XLmZtdCBGbG9hdGluZyBQb2ludCBDb252ZXJ0IHRvIFdvcmQgRml4ZWQgUG9pbnQNCiAqLw0K MDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBmZCg1KSAxMDAxMDA6DQoJU3RvcmVGUFIoZmQsIFcs IENvbnZlcnRGbXQoVmFsdWVGUFIoZnMsIGZtdCksIGZtdCwgVykpOw0KDQovKiBEQUREIERvdWJs ZXdvcmQgQWRkDQogKi8NCjAwMDAwMCBycyg1KSBydCg1KSByZCg1KSAwMDAwMCAxMDExMDA6DQoJ dWludDY0X3QgdGVtcDsNCglpbnQgY2Fycnk7DQoJdGVtcCA9IGFkZF9jYXJyeTY0KEdQUltyc10s IEdQUltydF0sICZjYXJyeSk7DQoJaWYgKGNhcnJ5KSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihJbnRl Z2VyT3ZlcmZsb3cpOw0KCX0gZWxzZSB7DQoJCUdQUltyZF0gPSB0ZW1wOw0KCX0NCg0KLyogREFE REkgRG91Ymxld29yZCBBZGQgSW1tZWRpYXRlDQogKi8NCjAxMTAwMCBycyg1KSBydCg1KSBpbW1l ZGlhdGUoMTYpOg0KCXVpbnQ2NF90IHRlbXA7DQoJaW50IGNhcnJ5Ow0KCXRlbXAgPSBhZGRfY2Fy cnk2NChHUFJbcnNdLCBzaWduX2V4dGVuZChpbW1lZGlhdGUsIDE2KSwgJmNhcnJ5KTsNCglpZiAo Y2FycnkpIHsNCgkJU2lnbmFsRXhjZXB0aW9uKEludGVnZXJPdmVyZmxvdyk7DQoJfSBlbHNlIHsN CgkJR1BSW3J0XSA9IHRlbXA7DQoJfQ0KDQovKiBEQURESVUgRG91Ymxld29yZCBBZGQgSW1tZWRp YXRlIFVuc2lnbmVkDQogKi8NCjAxMTAwMSBycyg1KSBydCg1KSBpbW1lZGlhdGUoMTYpOg0KCUdQ UltydF0gPSBHUFJbcnNdICsgc2lnbl9leHRlbmQoaW1tZWRpYXRlLCAxNik7DQoNCi8qIERBRERV IERvdWJsZXdvcmQgQWRkIFVuc2lnbmVkDQogKi8NCjAwMDAwMCBycyg1KSBydCg1KSByZCg1KSAw MDAwMCAxMDExMDE6DQoJR1BSW3JkXSA9IEdQUltyc10gKyBHUFJbcnRdOw0KDQovKiBEQ0xPL1og Q291bnQgTGVhZGluZyBPbmVzL1plcm9zIGluIERvdWJsZXdvcmQNCiAqLw0KMDExMTAwIHJzKDUp IHJ0KDUpIHJkKDUpIDAwMDAwIDEwMDEwIGlzX29uZSgxKToNCglpbnQgdGVtcCwgaTsNCgl0ZW1w ID0gNjQ7DQoJZm9yIChpID0gNjM7IGkgPj0gMDsgaS0tKSB7DQoJCWlmIChiaXQoR1BSW3JzXSxp KSA9PSBpc19vbmUpIHsNCgkJCXRlbXAgPSA2MyAtIGk7DQoJCQlicmVhazsNCgkJfQ0KCX0NCglH UFJbcmRdID0gdGVtcDsNCg0KLyogRERJViBEb3VibGV3b3JkIERpdmlkZQ0KICovDQowMDAwMDAg cnMoNSkgcnQoNSkgMDAwMDAgMDAwMDAgMDExMTEwOg0KCUxPID0gKGludDY0X3QpR1BSW3JzXSAv IChpbnQ2NF90KUdQUltydF07DQoJSEkgPSAoaW50NjRfdClHUFJbcnNdICUgKGludDY0X3QpR1BS W3J0XTsNCg0KLyogRERJVlUgRG91Ymxld29yZCBEaXZpZGUgVW5zaWduZWQNCiAqLw0KMDAwMDAw IHJzKDUpIHJ0KDUpIDAwMDAwIDAwMDAwIDAxMTExMToNCglMTyA9ICh1aW50NjRfdClHUFJbcnNd IC8gKHVpbnQ2NF90KUdQUltydF07DQoJSEkgPSAodWludDY0X3QpR1BSW3JzXSAlICh1aW50NjRf dClHUFJbcnRdOw0KDQovKiBERVJFVCBEZWJ1ZyBFeGNlcHRpb24gUmV0dXJuDQogKi8NCjAxMDAw MCAxIDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAgMDExMTExOg0KCURlYnVnLkRNPTA7DQoJRGVidWcu SUVYST0wOw0KCVBDID0gREVQQzsNCg0KLyogRElWIERpdmlkZSBXb3JkDQogKi8NCjAwMDAwMCBy cyg1KSBydCg1KSAwMDAwMCAwMDAwMCAwMTEwMTA6DQoJaW50NjRfdCBxLHI7DQoJaWYgKE5vdFdv cmRWYWx1ZShHUFJbcnNdKSB8fCBOb3RXb3JkVmFsdWUoR1BSW3J0XSkpIHsNCgkJVU5QUkVESUNU QUJMRTsNCgl9DQoJcSA9IChpbnQzMl90KUdQUltyc10gLyAoaW50MzJfdClHUFJbcnRdOw0KCXIg PSAoaW50MzJfdClHUFJbcnNdICUgKGludDMyX3QpR1BSW3J0XTsNCglMTyA9IHNpZ25fZXh0ZW5k KHEsIDMyKTsNCglISSA9IHNpZ25fZXh0ZW5kKHIsIDMyKTsNCg0KLyogRElWLmZtdCBGbG9hdGlu ZyBQb2ludCBEaXZpZGUNCiAqLw0KMDEwMDAxIGZtdCg1KSBmdCg1KSBmcyg1KSBmZCg1KSAwMDAw MTE6DQoJU3RvcmVGUFIoZmQsIGZtdCwgZmxvYXRfZGl2KFZhbHVlRlBSKGZzLCBmbXQpLFZhbHVl RlBSKGZ0LCBmbXQpKSk7DQoNCi8qIERJVlUgRGl2aWRlIFVuc2lnbmVkIFdvcmQNCiAqLw0KMDAw MDAwIHJzKDUpIHJ0KDUpIDAwMDAwIDAwMDAwIDAxMTAxMToNCgl1aW50MzJfdCBxLHI7DQoJaWYg KE5vdFdvcmRWYWx1ZShHUFJbcnNdKSB8fCBOb3RXb3JkVmFsdWUoR1BSW3J0XSkpIHsNCgkJVU5Q UkVESUNUQUJMRTsNCgl9DQoJcSA9ICh1aW50MzJfdClHUFJbcnNdIC8gKHVpbnQzMl90KUdQUlty dF07DQoJciA9ICh1aW50MzJfdClHUFJbcnNdICUgKHVpbnQzMl90KUdQUltydF07DQoJTE8gPSBz aWduX2V4dGVuZChxLCAzMik7DQoJSEkgPSBzaWduX2V4dGVuZChyLCAzMik7DQoNCi8qIERNRkMw IERvdWJsZXdvcmQgTW92ZSBmcm9tIENvcHJvY2Vzc29yIDANCiAqLw0KMDEwMDAwIDAwMDAxIHJ0 KDUpIHJkKDUpIDAwMDAwIDAwMCBzZWwoMyk6DQoJU2lnbmFsRXhjZXB0aW9uKFVuaW1wbGVtZW50 ZWQpOw0KDQovKiBETUZDMSBEb3VibGV3b3JkIE1vdmUgZnJvbSBGbG90aW5nIFBvaW50DQogKi8N CjAxMDAwMSAwMDAwMSBydCg1KSBmcyg1KSAwMDAwMCAwMDAwMDA6DQoJR1BSW3J0XSA9IFZhbHVl RlBSKGZzLCBVTklOVEVSUFJFVEVEX0RPVUJMRVdPUkQpOw0KDQovKiBETUZDMiBEb3VibGV3b3Jk IE1vdmUgZnJvbSBDb3Byb2Nlc3NvciAyDQogKi8NCjAxMDAxMCAwMDAwMSBydCg1KSBJbXBsKDE2 KToNCglTaWduYWxFeGNlcHRpb24oVW5pbXBsZW1lbnRlZCk7DQoNCi8qIERNVEMwIERvdWJsZXdv cmQgTW92ZSB0byBDb3Byb2Nlc3NvciAwDQogKi8NCjAxMDAwMCAwMDEwMSBydCg1KSByZCg1KSAw MDAwMCAwMDAgc2VsKDMpOg0KCVNpZ25hbEV4Y2VwdGlvbihVbmltcGxlbWVudGVkKTsNCg0KLyog RE1UQzEgRG91Ymxld29yZCBNb3ZlIHRvIEZsb2F0aW5nIFBvaW50DQogKi8NCjAxMDAwMSAwMDEw MSBydCg1KSBmcyg1KSAwMDAwMCAwMDAwMDA6DQoJU3RvcmVGUFIoZnMsIFVOSU5URVJQUkVURURf RE9VQkxFV09SRCwgR1BSW3J0XSk7DQoNCi8qIERNVEMyIERvdWJsZXdvcmQgTW92ZSB0byBDb3By b2Nlc3NvciAyDQogKi8NCjAxMDAxMCAwMDEwMSBydCg1KSBJbXBsKDE2KToNCglTaWduYWxFeGNl cHRpb24oVW5pbXBsZW1lbnRlZCk7DQoNCi8qIERNVUxUIERvdWJsZXdvcmQgTXVsdGlwbHkNCiAq Lw0KMDAwMDAwIHJzKDUpIHJ0KDUpIDAwMDAwIDAwMDAwIDAxMTEwMDoNCgltdWx0NjQoR1BSW3Jz XSxHUFJbcnRdLCZMTywmSEkpOw0KDQovKiBETVVMVFUgRG91Ymxld29yZCBNdWx0aXBseSBVbnNp Z25lZA0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgMDAwMDAgMDAwMDAgMDExMTAxOg0KCXVtdWx0 NjQoR1BSW3JzXSxHUFJbcnRdLCZMTywmSEkpOw0KDQovKiBEU0xMIERvdWJsZXdvcmQgU2hpZnQg TGVmdCBMb2dpY2FsDQogKi8NCjAwMDAwMCAwMDAwMCBydCg1KSByZCg1KSBzYSg1KSAxMTEwMDA6 DQoJR1BSW3JkXSA9IEdQUltydF0gPDwgc2E7DQoNCi8qIERTTEwzMiBEb3VibGV3b3JkIFNoaWZ0 IExlZnQgTG9naWNhbCBQbHVzIDMyDQogKi8NCjAwMDAwMCAwMDAwMCBydCg1KSByZCg1KSBzYSg1 KSAxMTExMDA6DQoJR1BSW3JkXSA9IEdQUltydF0gPDwgKDMyK3NhKTsNCg0KLyogRFNMTFYgRG91 Ymxld29yZCBTaGlmdCBMZWZ0IExvZ2ljYWwgVmFyaWFibGUNCiAqLw0KMDAwMDAwIHJzKDUpIHJ0 KDUpIHJkKDUpIDAwMDAwIDAxMDEwMDoNCglHUFJbcmRdID0gR1BSW3J0XSA8PCBiaXRzKEdQUlty c10sMCw1KTsNCg0KLyogRFNSQSBEb3VibGV3b3JkIFNoaWZ0IFJpZ2h0IEFyaXRobWV0aWMNCiAq Lw0KMDAwMDAwIDAwMDAwIHJ0KDUpIHJkKDUpIHNhKDUpIDExMTAxMToNCglHUFJbcmRdID0gKChp bnQ2NF90KUdQUltydF0pID4+IHNhOw0KDQovKiBEU1JBMzIgRG91Ymxld29yZCBTaGlmdCBSaWdo dCBBcml0aG1ldGljIFBsdXMgMzINCiAqLw0KMDAwMDAwIDAwMDAwIHJ0KDUpIHJkKDUpIHNhKDUp IDExMTExMToNCglzYSArPSAzMjsNCglHUFJbcmRdID0gKChpbnQ2NF90KUdQUltydF0pID4+IHNh Ow0KDQovKiBEU1JBViBEb3VibGV3b3JkIFNoaWZ0IFJpZ2h0IEFyaXRobWV0aWMgVmFyaWFibGUN CiAqLw0KMDAwMDAwIHJzKDUpIHJ0KDUpIHJkKDUpIDAwMDAwIDAxMDExMToNCglpbnQgc2E7DQoJ c2EgPSBiaXRzKEdQUltyc10sMCw1KTsNCglHUFJbcmRdID0gKChpbnQ2NF90KUdQUltydF0pID4+ IHNhOw0KDQovKiBEU0xSIERvdWJsZXdvcmQgU2hpZnQgUmlnaHQgTG9naWNhbA0KICovDQowMDAw MDAgMDAwMDAgcnQoNSkgcmQoNSkgc2EoNSkgMTExMDEwOg0KCUdQUltyZF0gPSAoKHVpbnQ2NF90 KUdQUltydF0pID4+IHNhOw0KDQovKiBEU0xSMzIgRG91Ymxld29yZCBTaGlmdCBSaWdodCBMb2dp Y2FsIFBsdXMgMzINCiAqLw0KMDAwMDAwIDAwMDAwIHJ0KDUpIHJkKDUpIHNhKDUpIDExMTExMDoN CglzYSArPSAzMjsNCglHUFJbcmRdID0gKCh1aW50NjRfdClHUFJbcnRdKSA+PiBzYTsNCg0KLyog RFNSTFYgRG91Ymxld29yZCBTaGlmdCBSaWdodCBMb2dpY2FsIFZhcmlhYmxlDQogKi8NCjAwMDAw MCBycyg1KSBydCg1KSByZCg1KSAwMDAwMCAwMTAxMTA6DQoJaW50IHNhOw0KCXNhID0gYml0cyhH UFJbcnNdLDAsNSk7DQoJR1BSW3JkXSA9ICgodWludDY0X3QpR1BSW3J0XSkgPj4gc2E7DQoNCi8q IERTVUIgRG91Ymxld29yZCBTdWJ0cmFjdA0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgcmQoNSkg MDAwMDAgMTAxMTEwOg0KCWludCBjYXJyeTsNCglpbnQ2NF90IHRlbXA7DQoJdGVtcCA9IHN1Yl9j YXJyeTY0KEdQUltyc10sR1BSW3J0XSwmY2FycnkpOw0KCWlmIChjYXJyeSkgew0KCQlTaWduYWxF eGNlcHRpb24oSW50ZWdlck92ZXJmbG93KTsNCgl9IGVsc2Ugew0KCQlHUFJbcmRdID0gdGVtcDsN Cgl9DQoNCi8qIERTVUJVIERvdWJsZXdvcmQgU3VidHJhY3QgVW5zaWduZWQNCiAqLw0KMDAwMDAw IHJzKDUpIHJ0KDUpIHJkKDUpIDAwMDAwIDEwMTExMToNCglHUFJbcmRdID0gR1BSW3JzXSAtIEdQ UltydF07DQoNCi8qIEVSRVQgRXhjZXB0aW9uIFJldHVybg0KICovDQowMTAwMDAgMSAwMDAwIDAw MDAwIDAwMDAwIDAwMDAwIDAxMTAwMDoNCgl1aW50NjRfdCB0ZW1wOw0KCWlmIChTdGF0dXMuRVJM ID09IDEpIHsNCgkJdGVtcCA9IEVycm9yRVBDOw0KCQlTdGF0dXMuRVJMID0gMDsNCgl9IGVsc2Ug ew0KCQl0ZW1wID0gRVBDOw0KCQlTdGF0dXMuRVhMID0gMDsNCgl9DQoJUEMgPSB0ZW1wOw0KCUxM Yml0ID0gMDsNCg0KLyogRkxPT1IuTC5mbXQgRmxvdGluZyBQb2ludCBDb252ZXJ0IHRvIExvbmcg Rml4ZWQgUG9pbnQNCiAqLw0KMDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBmZCg1KSAwMDEwMTE6 DQoJU3RvcmVGUFIoZmQsIEwsIENvbnZlcnRGbXQoVmFsdWVGUFIoZnMsIGZtdCksIGZtdCwgTCkp Ow0KDQovKiBGTE9PUi5XLmZtdCBGbG9hdGluZyBQb2ludCBGbG9vciBDb252ZXJ0IHRvIFdvcmQg Rml4ZWQgUG9pbnQNCiAqLw0KMDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBmZCg1KSAwMDExMTE6 DQoJU3RvcmVGUFIoZmQsIFcsIENvbnZlcnRGbXQoVmFsdWVGUFIoZnMsIGZtdCksIGZtdCwgVykp Ow0KDQovKiBKIEp1bXANCiAqLw0KMDAwMDEwIGluc3RyX2luZGV4KDI2KToNCgkvKiBJOiAqLw0K CU5leHRJbnN0cnVjdGlvbigpOw0KCS8qIEkrMTogKi8gUEMgPSAoUEMgJiAoKDEgPDwgMjgpLTEp KSB8IChpbnN0cl9pbmRleCA8PCAyKTsNCg0KLyogSkFMIEp1bXAgYW5kIExpbmsNCiAqLw0KMDAw MDExIGluc3RyX2luZGV4KDI2KToNCgkvKiBJOiAqLyAgIEdQUlszMV0gPSBQQyArIDQ7DQoJTmV4 dEluc3RydWN0aW9uKCk7DQoJLyogSSsxOiAqLyBQQyA9IChQQyAmICgoMSA8PCAyOCktMSkpIHwg KGluc3RyX2luZGV4IDw8IDIpOw0KDQovKiBKQUxSIEp1bXAgYW5kIExpbmsgUmVnaXN0ZXINCiAq Lw0KMDAwMDAwIHJzKDUpIDAwMDAwIHJkKDUpIGhpbnQoNSkgMDAxMDAxOg0KCXVpbnQ2NF90IHRl bXA7DQoJLyogSTogKi8gICB0ZW1wID0gR1BSW3JzXTsNCgkJICAgR1BSW3JkXSA9IFBDICsgNDsN CglOZXh0SW5zdHJ1Y3Rpb24oKTsNCgkvKiBJKzE6ICovIFBDID0gdGVtcDsNCg0KLyogSlIgSnVt cCBSZWdpc3Rlcg0KICovDQowMDAwMDAgcnMoNSkgMDAwMDAgMDAwMDAgaGludCg1KSAwMDEwMDA6 DQoJdWludDY0X3QgdGVtcDsNCgkvKiBJOiAqLyAgIHRlbXAgPSBHUFJbcnNdOw0KCU5leHRJbnN0 cnVjdGlvbigpOw0KCS8qIEkrMTogKi8gUEM9dGVtcDsNCg0KLyogTEIgTG9hZCBCeXRlDQogKi8N CjEwMDAwMCBiYXNlKDUpIHJ0KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdkFkZHIsZG91Ymxl d29yZDsNCgl2QWRkciA9IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwgMTYpOw0KCWRv dWJsZXdvcmQgPSBMb2FkTWVtb3J5KHZBZGRyLCBCWVRFKTsNCglHUFJbcnRdID0gc2lnbl9leHRl bmQoZG91Ymxld29yZCw4KTsNCg0KLyogTEJVIExvYWQgQnl0ZSBVbnNpZ25lZA0KICovDQoxMDAx MDAgYmFzZSg1KSBydCg1KSBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHZBZGRyOw0KCXZBZGRyID0g R1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0LCAxNik7DQoJR1BSW3J0XSA9IExvYWRNZW1v cnkodkFkZHIsIEJZVEUpOw0KDQovKiBMRCBMb2FkIERvdWJsZXdvcmQNCiAqLw0KMTEwMTExIGJh c2UoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkcjsNCgl2QWRkciA9IEdQUlti YXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwgMTYpOw0KCWlmIChiaXRzKHZBZGRyLDAsMikgIT0g MCkgew0KCQlTaWduYWxFeGNlcHRpb24oQWRkcmVzc0Vycm9yKTsNCgl9DQoJR1BSW3J0XSA9IExv YWRNZW1vcnkodkFkZHIsIERPVUJMRVdPUkQpOw0KDQovKiBMREMxIExvYWQgRG91Ymxld29yZCB0 byBGbG9hdGluZyBQb2ludA0KICovDQoxMTAxMDEgYmFzZSg1KSBmdCg1KSBvZmZzZXQoMTYpOg0K CXVpbnQ2NF90IHZBZGRyOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0 LCAxNik7DQoJaWYgKGJpdHModkFkZHIsMCwyKSAhPSAwKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihB ZGRyZXNzRXJyb3IpOw0KCX0NCglTdG9yZUZQUihmdCwgVU5JTlRFUlBSRVRFRF9ET1VCTEVXT1JE LCBMb2FkTWVtb3J5KHZBZGRyLCBET1VCTEVXT1JEKSk7DQoNCi8qIExEQzIgTG9hZCBEb3VibGV3 b3JkIHRvIENvcHJvY2Vzc29yIDINCiAqLw0KMTEwMTEwIGJhc2UoNSkgcnQoNSkgb2Zmc2V0KDE2 KToNCglTaWduYWxFeGNlcHRpb24oVW5pbXBsZW1lbnRlZCk7DQoJDQovKiBMREwgTG9hZCBEb3Vi bGV3b3JkIExlZnQNCiAqLw0KMDExMDEwIGJhc2UoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50 NjRfdCB2QWRkcixkb3VibGV3b3JkOw0KCWludCBieXRlOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsg c2lnbl9leHRlbmQob2Zmc2V0LCAxNik7DQoJYnl0ZSA9IGJpdHModkFkZHIsMCwyKTsNCglkb3Vi bGV3b3JkID0gTG9hZE1lbW9yeSh2QWRkciwgRE9VQkxFV09SRCk7DQoJR1BSW3J0XSA9IChiaXRz KGRvdWJsZXdvcmQsMCw3KzgqYnl0ZSkgPDwgKDY0LTgqYnl0ZSkpIHwgKGJpdHMoR1BSW3J0XSww LDYzLTgqYnl0ZSkpOw0KDQovKiBMRFIgTG9hZCBEb3VibGV3b3JkIFJpZ2h0DQogKi8NCjAxMTAx MSBiYXNlKDUpIHJ0KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdkFkZHIsZG91Ymxld29yZDsN CglpbnQgYnl0ZTsNCgl2QWRkciA9IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwgMTYp Ow0KCWJ5dGUgPSBiaXRzKHZBZGRyLDAsMik7DQoJZG91Ymxld29yZCA9IExvYWRNZW1vcnkodkFk ZHIsIERPVUJMRVdPUkQpOw0KCUdQUltydF0gPSAoYml0cyhHUFJbcnRdLDY0LTgqYnl0ZSw2Mykg PDwgKDY0LTgqYnl0ZSkpICB8IGJpdHMoZG91Ymxld29yZCw4KmJ5dGUsNjMpOw0KDQovKiBMRFhD MSBMb2FkIERvdWJsZXdvcmQgSW5kZXhlZCB0byBGbG9hdGluZyBQb2ludA0KICovDQowMTAwMTEg YmFzZSg1KSBpbmRleCg1KSAwMDAwMCBmZCg1KSAwMDAwMDE6CQ0KCXVpbnQ2NF90IHZBZGRyOw0K CXZBZGRyID0gR1BSW2Jhc2VdICsgR1BSW2luZGV4XTsNCglpZiAoYml0cyh2QWRkciwwLDIpICE9 IDApIHsNCgkJU2lnbmFsRXhjZXB0aW9uKEFkZHJlc3NFcnJvcik7DQoJfQ0KCVN0b3JlRlBSKGZk LCBVTklOVEVSUFJFVEVEX0RPVUJMRVdPUkQsIExvYWRNZW1vcnkodkFkZHIsIERPVUJMRVdPUkQp KTsNCg0KLyogTEggTG9hZCBIYWxmd29yZA0KICovDQoxMDAwMDEgYmFzZSg1KSBydCg1KSBvZmZz ZXQoMTYpOg0KCXVpbnQ2NF90IHZBZGRyLCBkb3VibGV3b3JkOw0KCXZBZGRyID0gR1BSW2Jhc2Vd ICsgc2lnbl9leHRlbmQob2Zmc2V0LCAxNik7DQoJaWYgKGJpdCh2QWRkciwwKSAhPSAwKSB7DQoJ CVNpZ25hbEV4Y2VwdGlvbihBZGRyZXNzRXJyb3IpOw0KCX0NCglkb3VibGV3b3JkID0gTG9hZE1l bW9yeSh2QWRkciwgSEFMRldPUkQpOw0KCUdQUltydF0gPSBzaWduX2V4dGVuZChkb3VibGV3b3Jk LDE2KTsNCg0KLyogTEhVIExvYWQgSGFsZndvcmQgVW5zaWduZWQNCiAqLw0KMTAwMTAxIGJhc2Uo NSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkcjsNCgl2QWRkciA9IEdQUltiYXNl XSArIHNpZ25fZXh0ZW5kKG9mZnNldCwgMTYpOw0KCWlmIChiaXQodkFkZHIsMCkgIT0gMCkgew0K CQlTaWduYWxFeGNlcHRpb24oQWRkcmVzc0Vycm9yKTsNCgl9DQoJR1BSW3J0XSA9IExvYWRNZW1v cnkodkFkZHIsIEhBTEZXT1JEKTsNCg0KLyogTEwgTG9hZCBMaW5rZWQgV29yZA0KICovDQoxMTAw MDAgYmFzZSg1KSBydCg1KSBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHZBZGRyOw0KCXZBZGRyID0g R1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0LCAxNik7DQoJaWYgKGJpdHModkFkZHIsMCwx KSAhPSAwKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihBZGRyZXNzRXJyb3IpOw0KCX0NCglHUFJbcnRd ID0gTG9hZE1lbW9yeSh2QWRkciwgV09SRCk7DQoJTExiaXQgPSAxOw0KDQovKiBMTEQgTG9hZCBM aW5rZWQgRG91Ymxld29yZA0KICovDQoxMTAxMDAgYmFzZSg1KSBydCg1KSBvZmZzZXQoMTYpOg0K CXVpbnQ2NF90IHZBZGRyOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0 LCAxNik7DQoJaWYgKGJpdHModkFkZHIsMCwyKSAhPSAwKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihB ZGRyZXNzRXJyb3IpOw0KCX0NCglHUFJbcnRdID0gTG9hZE1lbW9yeSh2QWRkciwgRE9VQkxFV09S RCk7DQoJTExiaXQgPSAxOw0KDQovKiBMVUkgTG9hZCBVcHBlciBJbW1lZGlhdGUNCiAqLw0KMDAx MTExIDAwMDAwIHJ0KDUpIGltbWVkaWF0ZSgxNik6DQoJR1BSW3J0XSA9IHNpZ25fZXh0ZW5kKGlt bWVkaWF0ZSwgMTYpIDw8IDE2Ow0KDQovKiBMVVhDMSBMb2FkIERvdWJsZXdvcmQgSW5kZXhlZCBV bmFsaWduZWQgdG8gRmxvcmluZyBQb2ludA0KICovDQowMTAwMTEgYmFzZSg1KSBpbmRleCg1KSAw MDAwMCBmZCg1KSAwMDAxMDE6DQoJdWludDY0X3QgdkFkZHI7DQoJdkFkZHIgPSAoR1BSW2Jhc2Vd K0dQUltpbmRleF0pICYgfig3TEwpOw0KCVN0b3JlRlBSKGZkLCBVTklOVEVSUFJFVEVEX0RPVUJM RVdPUkQsIExvYWRNZW1vcnkodkFkZHIsIERPVUJMRVdPUkQpKTsNCg0KLyogTFcgTG9hZCBXb3Jk DQogKi8NCjEwMDAxMSBiYXNlKDUpIHJ0KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdkFkZHIs ZG91Ymxld29yZDsNCgl2QWRkciA9IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwgMTYp Ow0KCWlmIChiaXRzKHZBZGRyLDAsMSkgIT0gMCkgew0KCQlTaWduYWxFeGNlcHRpb24oQWRkcmVz c0Vycm9yKTsNCgl9DQoJZG91Ymxld29yZCA9IExvYWRNZW1vcnkodkFkZHIsIFdPUkQpOw0KCUdQ UltydF0gPSBzaWduX2V4dGVuZChkb3VibGV3b3JkLDMyKTsNCg0KLyogTFdDMSBMb2FkIFdvcmQg dG8gRmxvYXRpbmcgUG9pbnQNCiAqLw0KMTEwMDAxIGJhc2UoNSkgZnQoNSkgb2Zmc2V0KDE2KToN Cgl1aW50NjRfdCB2QWRkcixkb3VibGV3b3JkOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9l eHRlbmQob2Zmc2V0LCAxNik7DQoJaWYgKGJpdHModkFkZHIsMCwxKSAhPSAwKSB7DQoJCVNpZ25h bEV4Y2VwdGlvbihBZGRyZXNzRXJyb3IpOw0KCX0NCglkb3VibGV3b3JkID0gTG9hZE1lbW9yeSh2 QWRkciwgV09SRCk7DQoJU3RvcmVGUFIoZnQsIFVOSU5URVJQUkVURURfV09SRCwgc2lnbl9leHRl bmQoZG91Ymxld29yZCwzMikpOw0KDQovKiBMV0MyIExvYWQgV29yZCB0byBDb3Byb2Nlc3NvciAy DQogKi8NCjExMDAxMCBiYXNlKDUpIHJ0KDUpIG9mZnNldCgxNik6DQoJU2lnbmFsRXhjZXB0aW9u KFVuaW1wbGVtZW50ZWQpOw0KDQovKiBMV0wgTG9hZCBXb3JkIExlZnQNCiAqLw0KMTAwMDEwIGJh c2UoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkcixkb3VibGV3b3JkOw0KCWlu dCBieXRlOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0LCAxNik7DQoJ Ynl0ZSA9IFdPUkQgLSBiaXRzKHZBZGRyLDAsMSk7DQoJZG91Ymxld29yZCA9IExvYWRNZW1vcnko dkFkZHIsIGJ5dGUpOw0KCWRvdWJsZXdvcmQgPSAoYml0cyhkb3VibGV3b3JkLDAsMzEtOCpieXRl KSA8PCAoOCpieXRlKSkgfCBiaXRzKEdQUltydF0sMCw4KmJ5dGUpOw0KCUdQUltydF09c2lnbl9l eHRlbmQoZG91Ymxld29yZCwzMik7DQoJDQovKiBMV1IgTG9hZCBXb3JkIFJpZ2h0DQogKi8NCjEw MDExMCBiYXNlKDUpIHJ0KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdkFkZHIsZG91Ymxld29y ZDsNCglpbnQgYnl0ZSx3b3JkOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zm c2V0LCAxNik7DQoJYnl0ZSA9IGJpdHModkFkZHIsMCwxKSArIDE7DQoJZG91Ymxld29yZCA9IExv YWRNZW1vcnkodkFkZHIgJiB+MywgYnl0ZSk7DQoJZG91Ymxld29yZCA9IChiaXRzKEdQUltydF0s OCpieXRlLDMxKSA8PCAoOCpieXRlKSkgfCBiaXRzKGRvdWJsZXdvcmQsMCw4KmJ5dGUpOw0KCWlm IChieXRlID09IFdPUkQpDQoJCXNpZ25fZXh0ZW5kKGRvdWJsZXdvcmQsMzIpOw0KCUdQUltydF09 ZG91Ymxld29yZDsNCgkNCi8qIExXVSBMb2FkIFdvcmQgVW5zaWduZWQNCiAqLw0KMTAwMTExIGJh c2UoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkcjsNCgl2QWRkciA9IEdQUlti YXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwxNik7DQoJR1BSW3J0XSA9IExvYWRNZW1vcnkodkFk ZHIsIFdPUkQpOw0KDQovKiBMV1hDMSBMb2FkIFdvcmQgSW5kZXhlZCB0byBGbG9hdGluZyBQb2lu dA0KICovDQowMTAwMTEgYmFzZSg1KSBpbmRleCg1KSAwMDAwMCBmZCg1KSAwMDAwMDA6DQoJdWlu dDY0X3QgdkFkZHIsZG91Ymxld29yZDsNCgl2QWRkciA9IEdQUltiYXNlXSArIEdQUltpbmRleF07 DQoJZG91Ymxld29yZCA9IExvYWRNZW1vcnkodkFkZHIsIFdPUkQpOw0KCVN0b3JlRlBSKGZkLCBV TklOVEVSUFJFVEVEX0RPVUJMRVdPUkQsIHNpZ25fZXh0ZW5kKGRvdWJsZXdvcmQsIDMyKSk7DQoN Ci8qIE1BREQgTXVsdGlwbHkgYW5kIEFkZCBXb3JkIHRvIEhpLExvDQogKi8NCjAxMTEwMCBycyg1 KSBydCg1KSAwMDAwMCAwMDAwMCAwMDAwMDA6DQoJdWludDY0X3QgdGVtcDsNCglpZiAoTm90V29y ZFZhbHVlKEdQUltyc10pIHx8IE5vdFdvcmRWYWx1ZShHUFJbcnRdKSkgew0KCQlVTlBSRURJQ1RB QkxFOw0KCX0NCgl0ZW1wID0gKGJpdHMoSEksMCwzMSkgPDwgMzIpIHwgYml0cyhMTywwLDMxKTsN Cgl0ZW1wICs9IG11bHQzMihiaXRzKEdQUltyc10sMCwzMSksYml0cyhHUFJbcnRdLDAsMzEpKTsN CglISSA9IHNpZ25fZXh0ZW5kKGJpdHModGVtcCwzMiw2MyksMzIpOw0KCUxPID0gc2lnbl9leHRl bmQoYml0cyh0ZW1wLDAsMzEpLDMyKTsNCg0KLyogTUFERC5mbXQgRmxvYXRpbmcgUG9pbnQgTXVs dGlwbHkgQWRkDQogKi8NCjAxMDAxMSBmcig1KSBmdCg1KSBmcyg1KSBmZCg1KSAxMDAgZm10KDMp Og0KCXVpbnQ2NF90IHZmcix2ZnMsdmZ0Ow0KCXZmciA9IFZhbHVlRlBSKGZyLCBmbXQpOw0KCXZm cyA9IFZhbHVlRlBSKGZzLCBmbXQpOw0KCXZmdCA9IFZhbHVlRlBSKGZ0LCBmbXQpOw0KCVN0b3Jl RlBSKGZkLCBmbXQsIGZsb2F0X2FkZChmbG9hdF9tdWx0KHZmcyx2ZnQpLHZmcikpOw0KDQovKiBN QUREVSBNdWx0aXBseSBhbmQgQWRkIFVuc2lnbmVkIFdvcmQgdG8gSGksTG8NCiAqLw0KMDExMTAw IHJzKDUpIHJ0KDUpIDAwMDAwIDAwMDAwIDAwMDAwMToNCgl1aW50NjRfdCB0ZW1wOw0KCWlmIChO b3RXb3JkVmFsdWUoR1BSW3JzXSkgfHwgTm90V29yZFZhbHVlKEdQUltydF0pKSB7DQoJCVVOUFJF RElDVEFCTEU7DQoJfQ0KCXRlbXAgPSAoYml0cyhISSwwLDMxKSA8PCAzMikgfCBiaXRzKExPLDAs MzEpOw0KCXRlbXAgKz0gdW11bHQ2NChiaXRzKEdQUltyc10sMCwzMSksYml0cyhHUFJbcnRdLDAs MzEpLCZMTywmSEkpOw0KCUhJID0gc2lnbl9leHRlbmQoYml0cyh0ZW1wLDMyLDYzKSwgMzIpOw0K CUxPID0gc2lnbl9leHRlbmQoYml0cyh0ZW1wLDAsMzEpLCAzMik7DQoNCi8qIE1GQzAgTW92ZSBm cm9tIENvcHJvY2Vzc29yIDANCiAqLw0KMDEwMDAwIDAwMDAwIHJ0KDUpIHJkKDUpIDAwMDAwIDAw MCBzZWwoMyk6DQoJU2lnbmFsRXhjZXB0aW9uKFVuaW1wbGVtZW50ZWQpOw0KDQovKiBNRkMxIE1v dmUgZnJvbSBDb3Byb2Nlc3NvciAxDQogKi8NCjAxMDAwMSAwMDAwMCBydCg1KSBmcyg1KSAwMDAw MCAwMDAwMDA6DQoJdWludDY0X3QgZGF0YTsNCglkYXRhID0gYml0cyhWYWx1ZUZQUihmcywgVU5J TlRFUlBSRVRFRF9XT1JEKSwwLDMxKTsNCglHUFJbcnRdID0gc2lnbl9leHRlbmQoZGF0YSwgMzIp Ow0KDQovKiBNRkMyIE1vdmUgZnJvbSBDb3Byb2Nlc3NvciAyDQogKi8NCjAxMDAxMCAwMDAwMCBy dCg1KSBJbXBsKDE2KToNCglTaWduYWxFeGNlcHRpb24oVW5pbXBsZW1lbnRlZCk7DQoNCi8qIE1G SEkgTW92ZSBmcm9tIEhJIFJlZ2lzdGVyDQogKi8NCjAwMDAwMCAwMDAwMCAwMDAwMCByZCg1KSAw MDAwMCAwMTAwMDA6DQoJR1BSW3JkXSA9IEhJOw0KDQovKiBNRkxPIE1vdmUgRnJvbSBMTyBSZWdp c3Rlcg0KICovDQowMDAwMDAgMDAwMDAgMDAwMDAgcmQoNSkgMDAwMDAgMDEwMDEwOg0KCUdQUlty ZF0gPSBMTzsNCg0KLyogTU9WLmZtdCBGbG9hdGluZyBQb2ludCBNb3ZlDQogKi8NCjAxMDAwMSBm bXQoNSkgMDAwMDAgZnMoNSkgZmQoNSkgMDAwMTEwOg0KCVN0b3JlRlBSKGZkLCBmbXQsIFZhbHVl RlBSKGZzLCBmbXQpKTsNCg0KLyogTU9WRi9UIE1vdmUgQ29uZGl0aW9uYWwgb24gRmxvYXRpbmcg UG9pbnQgRmFsc2UvVHJ1ZQ0KICovDQowMDAwMDAgcnMoNSkgY2MoMykgMCB0ZigxKSByZCg1KSAw MDAwMCAwMDAwMDE6DQoJaWYgKEZQQ29uZGl0aW9uQ29kZShjYykgPT0gdGYpIHsNCgkJR1BSW3Jk XSA9IEdQUltyc107DQoJfQ0KDQovKiBNT1ZGL1QuZm10IEZsb2F0aW5nIFBvaW50IE1vdmUgQ29u ZGl0aW9uYWwgb24gRmxvYXRpbmcgUG9pbnQgRmFsc2UvVHJ1ZQ0KICovDQowMTAwMDEgZm10KDUp IGNjKDMpIDAgdGYoMSkgZnMoNSkgZmQoNSkgMDEwMDAxOg0KCVNpZ25hbEV4Y2VwdGlvbihVbmlt cGxlbWVudGVkKTsNCgkvKiANCglpZiAoZm10ICE9IFBTKSB7DQoJCWlmIChGUENvbmRpdGlvbkNv ZGUoY2MpID09IDEpIHsNCgkJCVN0b3JlRlBSKGZkLCBmbXQsIFZhbHVlRlBSKGZzLCBmbXQpKTsN CgkJfQ0KCX0gZWxzZSB7DQoJCWludCBtYXNrPTA7DQoJCWlmIChGUENvbmRpdGlvbkNvZGUoY2Mr MCkgPT0gMSkgew0KCQkJbWFzayB8PSAweEYwOw0KCQl9DQoJCWlmIChGUENvbmRpdGlvbkNvZGUo Y2MrMSkgPT0gMSkgew0KCQkJbWFzayB8PSAweDBGOw0KCQl9DQoJCVN0b3JlRlBSKGZkLCBQUywg Qnl0ZU1lcmdlKG1hc2ssIGZkLCBmcykpOw0KCX0gKi8NCg0KLyogTU9WTiBNb3ZlIENvbmRpdGlv bmFsIG9uIE5vdCBaZXJvDQogKi8NCjAwMDAwMCBycyg1KSBydCg1KSByZCg1KSAwMDAwMCAwMDEw MTE6DQoJaWYgKEdQUltydF0gIT0gMCkgew0KCQlHUFJbcmRdID0gR1BSW3JzXTsNCgl9DQoNCi8q IE1PVk4uZm10IEZsb2F0aW5nIFBvaW50IE1vdmUgQ29uZGl0aW9uYWwgb24gTm90IFplcm8NCiAq Lw0KMDEwMDAxIGZtdCg1KSBydCg1KSBmcyg1KSBmZCg1KSAwMTAwMTE6DQoJaWYgKEdQUltydF0g IT0gMCkgew0KCQlTdG9yZUZQUihmZCwgZm10LCBWYWx1ZUZQUihmcywgZm10KSk7DQoJfQ0KDQov KiBNT1ZaIE1vdmUgQ29uZGl0aW9uYWwgb24gWmVybw0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkg cmQoNSkgMDAwMDAgMDAxMDEwOg0KCWlmIChHUFJbcnRdID09IDApIHsNCgkJR1BSW3JkXSA9IEdQ Ultyc107DQoJfQ0KDQovKiBNT1ZaLmZtdCBGbG9hdGluZyBQb2ludCBNb3ZlIENvbmRpdGlvbmFs IG9uIFplcm8NCiAqLw0KMDEwMDAxIGZtdCg1KSBydCg1KSBmcyg1KSBmZCg1KSAwMTAwMTA6DQoJ aWYgKEdQUltydF0gPT0gMCkgew0KCQlTdG9yZUZQUihmZCwgZm10LCBWYWx1ZUZQUihmcywgZm10 KSk7DQoJfQ0KDQovKiBNU1VCIE11bHRpcGx5IGFuZCBTdWJ0cmFjdCBXb3JkIHRvIEhpLExvDQog Ki8NCjAxMTEwMCBycyg1KSBydCg1KSAwMDAwMCAwMDAwMCAwMDAxMDA6DQoJaW50NjRfdCB0ZW1w Ow0KCWlmIChOb3RXb3JkVmFsdWUoR1BSW3JzXSkgfHwgTm90V29yZFZhbHVlKEdQUltydF0pKSB7 DQoJCVVOUFJFRElDVEFCTEU7DQoJfQ0KCXRlbXAgPSAoYml0cyhISSwwLDMxKTw8MzIpIHwgYml0 cyhMTywwLDMxKTsNCgl0ZW1wIC09IG11bHQzMihiaXRzKEdQUltyc10sMCwzMSksYml0cyhHUFJb cnRdLDAsMzEpKTsNCglISSA9IHNpZ25fZXh0ZW5kKGJpdHModGVtcCwzMiw2MyksMzIpOw0KCUxP ID0gc2lnbl9leHRlbmQoYml0cyh0ZW1wLDAsMzEpLDMyKTsNCg0KLyogTVNVQi5mbXQgRmxvYXRp bmcgUG9pbnQgTXVsdGlwbHkgU3VidHJhY3QNCiAqLw0KMDEwMDExIGZyKDUpIGZ0KDUpIGZzKDUp IGZkKDUpIDEwMSBmbXQoMyk6DQoJZmxvYXRfdCB2ZnIsdmZ0LHZmczsNCgl2ZnIgPSBWYWx1ZUZQ UihmciwgZm10KTsNCgl2ZnMgPSBWYWx1ZUZQUihmcywgZm10KTsNCgl2ZnQgPSBWYWx1ZUZQUihm dCwgZm10KTsNCglTdG9yZUZQUihmZCwgZm10LCBmbG9hdF9zdWIoZmxvYXRfbXVsdCh2ZnMsdmZ0 KSx2ZnIpKTsNCg0KLyogTVNVQlUgTXVsdGlwbHkgYW5kIFN1YnRyYWN0IFdvcmQgdG8gSGksTG8N CiAqLw0KMDExMTAwIHJzKDUpIHJ0KDUpIDAwMDAwIDAwMDAwIDAwMDEwMToNCgl1aW50NjRfdCB0 ZW1wOw0KCWlmIChOb3RXb3JkVmFsdWUoR1BSW3JzXSkgfHwgTm90V29yZFZhbHVlKEdQUltydF0p KSB7DQoJCVVOUFJFRElDVEFCTEU7DQoJfQ0KCXRlbXAgPSAoYml0cyhISSwwLDMxKTw8MzIpIHwg Yml0cyhMTywwLDMxKTsNCgl0ZW1wIC09IHVtdWx0MzIoYml0cyhHUFJbcnNdLDAsMzEpLGJpdHMo R1BSW3J0XSwwLDMxKSk7DQoJSEkgPSBzaWduX2V4dGVuZChiaXRzKHRlbXAsMzIsNjMpLDMyKTsN CglMTyA9IHNpZ25fZXh0ZW5kKGJpdHModGVtcCwwLDMxKSwzMik7DQoNCi8qIE1UQzAgTW92ZSB0 byBDb3Byb2Nlc3NvciAwDQogKi8NCjAxMDAwMCAwMDEwMCBydCg1KSByZCg1KSAwMDAwMCAwMDAg c2VsKDMpOg0KCVNpZ25hbEV4Y2VwdGlvbihVbmltcGxlbWVudGVkKTsNCg0KLyogTVRDMSBNb3Zl IFdvcmQgdG8gRmxvYXRpbmcgUG9pbnQNCiAqLw0KMDEwMDAxIDAwMTAwIHJ0KDUpIGZzKDUpIDAw MDAwIDAwMDAwMDoNCglTdG9yZUZQUihmcywgVU5JTlRFUlBSRVRFRF9XT1JELCBiaXRzKEdQUlty dF0sMCwzMSkpOw0KDQovKiBNVEMyIE1vdmUgV29yZCB0byBDb3Byb2Nlc3NvciAyDQogKi8NCjAx MDAxMCAwMDEwMCBydCg1KSBJbXBsKDE2KToNCglTaWduYWxFeGNlcHRpb24oVW5pbXBsZW1lbnRl ZCk7DQoNCi8qIE1USEkgTW92ZSB0byBISSBSZWdpc3Rlcg0KICovDQowMDAwMDAgcnMoNSkgMDAw MDAgMDAwMDAgMDAwMDAgMDEwMDAxOg0KCUhJID0gR1BSW3JzXTsNCg0KLyogTVRMTyBNb3ZlIHRv IExPIFJlZ2lzdGVyDQogKi8NCjAwMDAwMCBycyg1KSAwMDAwMCAwMDAwMCAwMDAwMCAwMTAwMTE6 DQoJTE8gPSBHUFJbcnNdOw0KDQovKiBNVUwgTXVsdGlwbHkgV29yZCB0byBHUFINCiAqLw0KMDEx MTAwIHJzKDUpIHJ0KDUpIHJkKDUpIDAwMDAwIDAwMDAxMDoNCglpbnQzMl90IHRlbXA7DQoJaWYg KE5vdFdvcmRWYWx1ZShHUFJbcnRdKSB8fCBOb3RXb3JkVmFsdWUoR1BSW3J0XSkpIHsNCgkJVU5Q UkVESUNUQUJMRTsNCgl9DQoJdGVtcCA9IG11bHQzMihiaXRzKEdQUltyc10sMCwzMSksIGJpdHMo R1BSW3J0XSwwLDMxKSk7DQoJR1BSW3JkXSA9IHNpZ25fZXh0ZW5kKHRlbXAsMzIpOw0KDQovKiBN VUwuZm10IEZsb2F0aW5nIFBvaW50IE11bHRpcGx5DQogKi8NCjAxMDAwMSBmbXQoNSkgZnQoNSkg ZnMoNSkgZmQoNSkgMDAwMDEwOg0KCVN0b3JlRlBSKGZkLCBmbXQsIGZsb2F0X211bHQoVmFsdWVG UFIoZnMsIGZtdCksIFZhbHVlRlBSKGZ0LCBmbXQpKSk7DQoNCi8qIE1VTFQgTXVsdGlwbHkgV29y ZA0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgMDAwMDAgMDAwMDAgMDExMDAwOg0KCWludDY0X3Qg dGVtcDsNCglpZiAoTm90V29yZFZhbHVlKEdQUltyc10pIHx8IE5vdFdvcmRWYWx1ZShHUFJbcnRd KSkgew0KCQlVTlBSRURJQ1RBQkxFOw0KCX0NCgl0ZW1wID0gbXVsdDMyKGJpdHMoR1BSW3JzXSww LDMxKSwgYml0cyhHUFJbcnRdLDAsMzEpKTsNCglMTyA9IHNpZ25fZXh0ZW5kKGJpdHModGVtcCww LDMxKSwzMik7DQoJSEkgPSBzaWduX2V4dGVuZChiaXRzKHRlbXAsMzIsNjMpLDMyKTsNCg0KLyog TVVMVFUgTXVsdGlwbHkgVW5zaWduZWQgV29yZA0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgMDAw MDAgMDAwMDAgMDExMDAxOg0KCWludDY0X3QgdGVtcDsNCglpZiAoTm90V29yZFZhbHVlKEdQUlty c10pIHx8IE5vdFdvcmRWYWx1ZShHUFJbcnRdKSkgew0KCQlVTlBSRURJQ1RBQkxFOw0KCX0NCgl0 ZW1wID0gdW11bHQzMihiaXRzKEdQUltyc10sMCwzMSksIGJpdHMoR1BSW3J0XSwwLDMxKSk7DQoJ TE8gPSBzaWduX2V4dGVuZChiaXRzKHRlbXAsMCwzMSksMzIpOw0KCUhJID0gc2lnbl9leHRlbmQo Yml0cyh0ZW1wLDMyLDYzKSwzMik7DQoNCi8qIE5FRy5mbXQgRmxvYXRpbmcgUG9pbnQgTmVnYXRl DQogKi8NCjAxMDAwMSBmbXQoNSkgMDAwMDAgZnMoNSkgZmQoNSkgMDAwMTExOg0KCVN0b3JlRlBS KGZkLCBmbXQsIGZsb2F0X25lZ2F0ZShWYWx1ZUZQUihmcywgZm10KSkpOw0KDQovKiBOTUFERC5m bXQgRmxvYXRpbmcgUG9pbnQgTmVnYXRpdmUgTXVsdGlwbHkgQWRkDQogKi8NCjAxMDAxMSBmcig1 KSBmdCg1KSBmcyg1KSBmZCg1KSAxMTAgZm10KDMpOg0KCWZsb2F0X3QgdmZyLHZmcyx2ZnQ7DQoJ dmZyID0gVmFsdWVGUFIoZnIsIGZtdCk7DQoJdmZzID0gVmFsdWVGUFIoZnMsIGZtdCk7DQoJdmZ0 ID0gVmFsdWVGUFIoZnQsIGZtdCk7DQoJU3RvcmVGUFIoZmQsIGZtdCwgZmxvYXRfbmVnYXRlKGZs b2F0X2FkZCh2ZnIsZmxvYXRfbXVsdCh2ZnMsdmZ0KSkpKTsNCg0KLyogTk1TVUIuZm10IEZsb2F0 aW5nIFBvaW50IE5lZ2F0aXZlIE11bHRpcGx5IFN1YnRyYWN0DQogKi8NCjAxMDAxMSBmcig1KSBm dCg1KSBmcyg1KSBmZCg1KSAxMTEgZm10KDMpOg0KCWZsb2F0X3QgdmZyLHZmcyx2ZnQ7DQoJdmZy ID0gVmFsdWVGUFIoZnIsIGZtdCk7DQoJdmZzID0gVmFsdWVGUFIoZnMsIGZtdCk7DQoJdmZ0ID0g VmFsdWVGUFIoZnQsIGZtdCk7DQoJU3RvcmVGUFIoZmQsIGZtdCwgZmxvYXRfbmVnYXRlKGZsb2F0 X3N1YihmbG9hdF9tdWx0KHZmcyx2ZnQpLHZmcikpKTsNCg0KLyogTk9QIE5vIG9wZXJhdGlvbg0K ICovDQowMDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAwOg0KCS8qIERvIG5vdGhp bmcgKi8NCg0KLyogTk9SIE5vdCBPcg0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgcmQoNSkgMDAw MDAgMTAwMTExOg0KCUdQUltyZF0gPSB+KEdQUltyc10gfCBHUFJbcnRdKTsNCg0KLyogT1IgT3IN CiAqLw0KMDAwMDAwIHJzKDUpIHJ0KDUpIHJkKDUpIDAwMDAwIDEwMDEwMToNCglHUFJbcmRdID0g R1BSW3JzXSB8IEdQUltydF07DQoNCi8qIE9SSSBPciBJbW1lZGlhdGUNCiAqLw0KMDAxMTAxIHJz KDUpIHJ0KDUpIGltbWVkaWF0ZSgxNik6DQoJR1BSW3J0XSA9IEdQUltyc10gfCB6ZXJvX2V4dGVu ZChpbW1lZGlhdGUsMTYpOw0KDQovKiBQTEwuUFMgUGFpciBMb3dlciBMb3dlcg0KICovDQowMTAw MDEgMTAxMTAgZnQoNSkgZnMoNSkgZmQoNSkgMTAxMTAwOg0KCVN0b3JlRlBSKGZkLCBQUywgKGJp dHMoVmFsdWVGUFIoZnMsIFBTKSwwLDMxKSA8PCAzMikgfCBiaXRzKFZhbHVlRlBSKGZ0LCBQUyks MCwzMSkpOw0KDQovKiBQTFUuUFMgUGFpciBMb3dlciBVcHBlcg0KICovDQowMTAwMDEgMTAxMTAg ZnQoNSkgZnMoNSkgZmQoNSkgMTAxMTAxOg0KCVN0b3JlRlBSKGZkLCBQUywgKGJpdHMoVmFsdWVG UFIoZnMsIFBTKSwwLDMxKSA8PCAzMikgfCBiaXRzKFZhbHVlRlBSKGZ0LCBQUyksMzIsNjMpKTsN Cg0KLyogUFJFRiBQcmVmZXRjaA0KICovDQoxMTAwMTEgYmFzZSg1KSBoaW50KDUpIG9mZnNldCgx Nik6DQoJLyogRG8gbm90aGluZyAqLw0KDQovKiBQUkVGSSBQcmVmZXRjaCBJbmRleGVkDQogKi8N CjAxMDAxMSBiYXNlKDUpIGluZGV4KDUpIGhpbnQoNSkgMDAwMDAgMDAxMTExOg0KCS8qIERvIG5v dGhpbmcgKi8NCg0KLyogUFVMLlBTIFBhaXIgVXBwZXIgTG93ZXINCiAqLw0KMDEwMDAxIDEwMTEw IGZ0KDUpIGZzKDUpIGZkKDUpIDEwMTExMDoNCglTdG9yZUZQUihmZCwgUFMsIChiaXRzKFZhbHVl RlBSKGZzLCBQUyksMzIsNjMpIDw8IDMyKSB8IGJpdHMoVmFsdWVGUFIoZnQsIFBTKSwwLDMxKSk7 DQoNCi8qIFBVVS5QUyBQYWlyIFVwcGVyIFVwcGVyDQogKi8NCjAxMDAwMSAxMDExMCBmdCg1KSBm cyg1KSBmZCg1KSAxMDExMTE6DQoJU3RvcmVGUFIoZmQsIFBTLCAoYml0cyhWYWx1ZUZQUihmcywg UFMpLDMyLDYzKSA8PCAzMikgfCBiaXRzKFZhbHVlRlBSKGZ0LCBQUyksMzIsNjMpKTsNCg0KLyog UkVDSVAuZm10IFJlY2lwcm9jYWwgQXBwcm94aW1hdGlvbg0KICovDQowMTAwMDEgZm10KDUpIDAw MDAwIGZzKDUpIGZkKDUpIDAxMDEwMToNCglTdG9yZUZQUihmZCwgZm10LCBmbG9hdF9yZWNpcChW YWx1ZUZQUihmcywgZm10KSkpOw0KDQovKiBST1VORC5MLmZtdCBGbG9hdGluZyBwb2ludCBSb3Vu ZA0KICovDQowMTAwMDEgZm10KDUpIDAwMDAwIGZzKDUpIGZkKDUpIDAwMTAwMDoNCglTdG9yZUZQ UihmZCwgTCwgQ29udmVydEZtdChWYWx1ZUZQUihmZCwgZm10KSwgZm10LCBMKSk7DQoNCi8qIFJP VU5ELlcuZm10IEZsb2F0aW5nIHBvaW50IFJvdW5kDQogKi8NCjAxMDAwMSBmbXQoNSkgMDAwMDAg ZnMoNSkgZmQoNSkgMDAxMTAwOg0KCVN0b3JlRlBSKGZkLCBXLCBDb252ZXJ0Rm10KFZhbHVlRlBS KGZkLCBmbXQpLCBmbXQsIFcpKTsNCg0KLyogUlNRUlQuZm10IFJlY2lwcm9jYWwgU3F1YXJlIFJv b3QgQXBwcm94aW1hdGlvbg0KICovDQowMTAwMDEgZm10KDUpIDAwMDAwIGZzKDUpIGZkKDUpIDAx MDExMDoNCglTdG9yZUZQUihmZCwgZm10LCBmbG9hdF9yZWNpcChmbG9hdF9zcXIoVmFsdWVGUFIo ZnMsIGZtdCkpKSk7DQoNCi8qIFNCIFN0b3JlIEJ5dGUNCiAqLw0KMTAxMDAwIGJhc2UoNSkgcnQo NSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkcjsNCgl2QWRkciA9IEdQUltiYXNlXSArIHNp Z25fZXh0ZW5kKG9mZnNldCwxNik7DQoJU3RvcmVNZW1vcnkodkFkZHIsIEJZVEUsIEdQUltydF0p Ow0KDQovKiBTQyBTdG9yZSBDb25kaXRpb25hbCBXb3JkDQogKi8NCjExMTAwMCBiYXNlKDUpIHJ0 KDUpIG9mZnNldCgxNik6DQoJdWludDY0X3QgdkFkZHI7DQoJdkFkZHIgPSBHUFJbYmFzZV0gKyBz aWduX2V4dGVuZChvZmZzZXQsMTYpOw0KCWlmIChiaXRzKHZBZGRyLDAsMSkgIT0gMCkgew0KCQlT aWduYWxFeGNlcHRpb24oQWRkcmVzc0Vycm9yKTsNCgl9DQoJaWYgKExMYml0KSB7DQoJCVN0b3Jl TWVtb3J5KHZBZGRyLCBCWVRFLCBHUFJbcnRdKTsNCgl9DQoJR1BSW3J0XSA9IExMYml0Ow0KDQov KiBTQ0QgU3RvcmUgQ29uZGl0aW9uYWwgRG91Ymxld29yZA0KICovDQoxMTExMDAgYmFzZSg1KSBy dCg1KSBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHZBZGRyOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsg c2lnbl9leHRlbmQob2Zmc2V0LDE2KTsNCglpZiAoYml0cyh2QWRkciwwLDEpICE9IDApIHsNCgkJ U2lnbmFsRXhjZXB0aW9uKEFkZHJlc3NFcnJvcik7DQoJfQ0KCWlmIChMTGJpdCkgew0KCQlTdG9y ZU1lbW9yeSh2QWRkciwgRE9VQkxFV09SRCwgR1BSW3J0XSk7DQoJfQ0KCUdQUltydF0gPSBMTGJp dDsNCg0KLyogU0QgU3RvcmUgRG91Ymxld29yZA0KICovDQoxMTExMTEgYmFzZSg1KSBydCg1KSBv ZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHZBZGRyLGRvdWJsZXdvcmQ7DQoJdkFkZHIgPSBHUFJbYmFz ZV0gKyBzaWduX2V4dGVuZChvZmZzZXQsMTYpOw0KCWlmIChiaXRzKHZBZGRyLDAsMSkgIT0gMCkg ew0KCQlTaWduYWxFeGNlcHRpb24oQWRkcmVzc0Vycm9yKTsNCgl9DQoJZG91Ymxld29yZCA9IEdQ UltydF07DQoJU3RvcmVNZW1vcnkodkFkZHIsIERPVUJMRVdPUkQsIGRvdWJsZXdvcmQpOw0KDQov KiBTREJCUCBTb2Z0d2FyZSBEZWJ1ZyBCcmVha3BvaW50DQogKi8NCjAxMTEwMCBjb2RlKDIwKSAx MTExMTE6DQoJaWYgKERlYnVnLkRNID09IDApIHsNCgkJU2lnbmFsRGVidWdCcmVha3BvaW50RXhj ZXB0aW9uKCk7DQoJfSBlbHNlIHsNCgkJU2lnbmFsRGVidWdNb2RlQnJlYWtwb2ludEV4Y2VwdGlv bigpOw0KCX0NCg0KLyogU0RDMSBTdG9yZSBEb3VibGV3b3JkIGZyb20gRmxvYXRpbmcgUG9pbnQN CiAqLw0KMTExMTAxIGJhc2UoNSkgZnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkcixk b3VibGV3b3JkOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0LDE2KTsN CglpZiAoYml0cyh2QWRkciwwLDEpICE9IDApIHsNCgkJU2lnbmFsRXhjZXB0aW9uKEFkZHJlc3NF cnJvcik7DQoJfQ0KCWRvdWJsZXdvcmQgPSBWYWx1ZUZQUihmdCwgVU5JTlRFUlBSRVRFRF9ET1VC TEVXT1JEKTsNCglTdG9yZU1lbW9yeSh2QWRkciwgRE9VQkxFV09SRCwgZG91Ymxld29yZCk7DQoN Ci8qIFNEQzIgU3RvcmUgRG91Ymxld29yZCBmcm9tIENvcHJvY2Vzc29yIDINCiAqLw0KMTExMTEw IGJhc2UoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCglTaWduYWxFeGNlcHRpb24oVW5pbXBsZW1lbnRl ZCk7DQoNCi8qIFNETCBTdG9yZSBEb3VibGV3b3JkIExlZnQNCiAqLw0KMTAxMTAwIGJhc2UoNSkg cnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkcixkb3VibGV3b3JkOw0KCWludCBieXRl Ow0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0LDE2KTsNCglieXRlID0g Yml0cyh2QWRkciwwLDIpOw0KCWRvdWJsZXdvcmQgPSBiaXRzKEdQUltydF0sNTYtOCpieXRlLDYz KTsNCglTdG9yZU1lbW9yeSh2QWRkciwgRE9VQkxFV09SRCwgZG91Ymxld29yZCk7DQoNCi8qIFNE UiBTdG9yZSBEb3VibGV3b3JkIFJpZ2h0DQogKi8NCjEwMTEwMSBiYXNlKDUpIHJ0KDUpIG9mZnNl dCgxNik6DQoJdWludDY0X3QgdkFkZHIsZG91Ymxld29yZDsNCglpbnQgYnl0ZTsNCgl2QWRkciA9 IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwxNik7DQoJYnl0ZSA9IGJpdHModkFkZHIs MCwyKTsNCglkb3VibGV3b3JkID0gYml0cyhHUFJbcnRdLDgqYnl0ZSw2MykgPDwgKDgqYnl0ZSk7 DQoJU3RvcmVNZW1vcnkodkFkZHIsIERPVUJMRVdPUkQsIGRvdWJsZXdvcmQpOw0KDQovKiBTRFhD MSBTdG9yZSBEb3VibGV3b3JkIEluZGV4ZWQgZnJvbSBGbG9hdGluZyBQb2ludA0KICovDQowMTAw MTEgYmFzZSg1KSBpbmRleCg1KSBmcyg1KSAwMDAwMCAwMDEwMDE6DQoJdWludDY0X3QgdkFkZHIs ZG91Ymxld29yZDsNCgl2QWRkciA9IEdQUltiYXNlXSArIEdQUltpbmRleF07DQoJaWYgKGJpdHMo dkFkZHIsMCwyKSAhPSAwKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihBZGRyZXNzRXJyb3IpOw0KCX0N Cglkb3VibGV3b3JkID0gVmFsdWVGUFIoZnMsIFVOSU5URVJQUkVURURfRE9VQkxFV09SRCk7DQoJ U3RvcmVNZW1vcnkodkFkZHIsIERPVUJMRVdPUkQsIGRvdWJsZXdvcmQpOw0KDQovKiBTSCBTdG9y ZSBIYWxmd29yZA0KICovDQoxMDEwMDEgYmFzZSg1KSBydCg1KSBvZmZzZXQoMTYpOg0KCXVpbnQ2 NF90IHZBZGRyOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0LDE2KTsN CglpZiAoYml0KHZBZGRyLDApICE9IDApIHsNCgkJU2lnbmFsRXhjZXB0aW9uKEFkZHJlc3NFcnJv cik7DQoJfQ0KCVN0b3JlTWVtb3J5KHZBZGRyLCBIQUxGV09SRCwgR1BSW3J0XSk7DQoNCi8qIFNM TCBTaGlmdCBXb3JkIExlZnQgTG9naWNhbA0KICovDQowMDAwMDAgMDAwMDAgcnQoNSkgcmQoNSkg c2EoNSkgMDAwMDAwOg0KCUdQUltyZF0gPSBzaWduX2V4dGVuZChHUFJbcnRdIDw8IHNhLDMyKTsN Cg0KLyogU0xMViBTaGlmdCBXb3JkIExlZnQgTG9naWNhbCBWYXJpYWJsZQ0KICovDQowMDAwMDAg cnMoNSkgcnQoNSkgcmQoNSkgMDAwMDAgMDAwMTAwOg0KCUdQUltyZF0gPSBzaWduX2V4dGVuZChH UFJbcnRdIDw8IGJpdHMoR1BSW3JzXSwwLDQpLDMyKTsNCg0KLyogU0xUIFNldCBvbiBMZXNzIFRo YW4NCiAqLw0KMDAwMDAwIHJzKDUpIHJ0KDUpIHJkKDUpIDAwMDAwIDEwMTAxMDoNCglpZiAoKGlu dDY0X3QpR1BSW3JzXSA8IChpbnQ2NF90KUdQUltydF0pIHsNCgkJR1BSW3JkXSA9IDE7DQoJfSBl bHNlIHsNCgkJR1BSW3JkXSA9IDA7DQoJfQ0KDQovKiBTTFRJIFNldCBvbiBMZXNzIFRoYW4gSW1t ZWRpYXRlDQogKi8NCjAwMTAxMCBycyg1KSBydCg1KSBpbW1lZGlhdGUoMTYpOg0KCWlmICgoaW50 NjRfdClHUFJbcnNdIDwgKGludDY0X3Qpc2lnbl9leHRlbmQoaW1tZWRpYXRlLCAxNikgKSB7DQoJ CUdQUltydF0gPSAxOw0KCX0gZWxzZSB7DQoJCUdQUltydF0gPSAwOw0KCX0NCg0KLyogU0xUSVUg U2V0IG9uIExlc3MgVGhhbiBJbW1lZGlhdGUgVW5zaWduZWQNCiAqLw0KMDAxMDExIHJzKDUpIHJ0 KDUpIGltbWVkaWF0ZSgxNik6DQoJaWYgKEdQUltyc10gPCBzaWduX2V4dGVuZChpbW1lZGlhdGUs MTYpKSB7DQoJCUdQUltydF0gPSAxOw0KCX0gZWxzZSB7DQoJCUdQUltydF0gPSAwOw0KCX0NCg0K LyogU0xUVSBTZXQgb24gTGVzcyB0aGFuIFVuc2lnbmVkDQogKi8NCjAwMDAwMCBycyg1KSBydCg1 KSByZCg1KSAwMDAwMCAxMDEwMTE6DQoJaWYgKEdQUltyc10gPCBHUFJbcnRdKSB7DQoJCUdQUlty ZF0gPSAxOw0KCX0gZWxzZSB7DQoJCUdQUltyZF0gPSAwOw0KCX0NCg0KLyogU1FSVC5mbXQgRmxv YXRpbmcgUG9pbnQgU3F1YXJlIFJvb3QNCiAqLw0KMDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBm ZCg1KSAwMDAxMDA6DQoJU3RvcmVGUFIoZmQsIGZtdCwgZmxvYXRfc3FyKFZhbHVlRlBSKGZzLCBm bXQpKSk7DQoNCi8qIFNSQSBTaGlmdCBXb3JkIFJpZ2h0IEFyaXRobWV0aWMNCiAqLw0KMDAwMDAw IDAwMDAwIHJ0KDUpIHJkKDUpIHNhKDUpIDAwMDAxMToNCgl1aW50NjRfdCB0ZW1wOw0KCWlmIChO b3RXb3JkVmFsdWUoR1BSW3J0XSkpIHsNCgkJVU5QUkVESUNUQUJMRTsNCgl9DQoJR1BSW3JkXSA9 IHNpZ25fZXh0ZW5kKEdQUltydF0gPj4gc2EsMzItc2EpOw0KDQovKiBTUkFWIFNoaWZ0IFdvcmQg UmlnaHQgQXJpdGhtZXRpYyBWYXJpYWJsZQ0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgcmQoNSkg MDAwMDAgMDAwMTExOg0KCWludCBzYTsNCgl1aW50NjRfdCB0ZW1wOw0KCWlmIChOb3RXb3JkVmFs dWUoR1BSW3J0XSkpIHsNCgkJVU5QUkVESUNUQUJMRTsNCgl9DQoJc2EgPSBiaXRzKEdQUltyc10s MCw0KTsNCglHUFJbcmRdID0gc2lnbl9leHRlbmQoR1BSW3J0XSA+PiBzYSwzMi1zYSk7DQoNCg0K LyogU1JMIFNoaWZ0IFdvcmQgUmlnaHQgTG9naWNhbA0KICovDQowMDAwMDAgMDAwMDAgcnQoNSkg cmQoNSkgc2EoNSkgMDAwMDEwOg0KCWlmIChOb3RXb3JkVmFsdWUoR1BSW3J0XSkpIHsNCgkJVU5Q UkVESUNUQUJMRTsNCgl9DQoJR1BSW3JkXSA9IHplcm9fZXh0ZW5kKEdQUltydF0gPj4gc2EsMzIt c2EpOw0KDQovKiBTUkxWIFNoaWZ0IFdvcmQgUmlnaHQgTG9naWNhbCBWYXJpYWJsZQ0KICovDQow MDAwMDAgcnMoNSkgcnQoNSkgcmQoNSkgMDAwMDAgMDAwMTEwOg0KCWludCBzYTsNCglpZiAoTm90 V29yZFZhbHVlKEdQUltydF0pKSB7DQoJCVVOUFJFRElDVEFCTEU7DQoJfQ0KCXNhID0gYml0cyhH UFJbcnNdLDAsNCk7DQoJR1BSW3JkXSA9IHplcm9fZXh0ZW5kKEdQUltydF0gPj4gc2EsMzItc2Ep Ow0KDQovKiBTVUIgU3VidHJhY3QgV29yZA0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgcmQoNSkg MDAwMDAgMTAwMDEwOg0KCXVpbnQ2NF90IHRlbXA7DQoJaWYgKE5vdFdvcmRWYWx1ZShHUFJbcnNd KSB8fCBOb3RXb3JkVmFsdWUoR1BSW3J0XSkpIHsNCgkJVU5QUkVESUNUQUJMRTsNCgl9DQoJdGVt cCAgPSAoYml0KEdQUltyc10sMzEpIDw8IDMyKSB8IGJpdHMoR1BSW3JzXSwwLDMxKTsNCgl0ZW1w IC09IChiaXQoR1BSW3J0XSwzMSkgPDwgMzIpIHwgYml0cyhHUFJbcnRdLDAsMzEpOw0KCWlmIChi aXQodGVtcCwzMikgIT0gYml0KHRlbXAsMzEpKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihJbnRlZ2Vy T3ZlcmZsb3cpOw0KCX0gZWxzZSB7DQoJCUdQUltyZF0gPSBzaWduX2V4dGVuZCh0ZW1wLDMyKTsN Cgl9DQoNCi8qIFNVQi5mbXQgRmxvYXRpbmcgUG9pbnQgU3VidHJhY3QNCiAqLw0KMDEwMDAxIGZt dCg1KSBmdCg1KSBmcyg1KSBmZCg1KSAwMDAwMDE6DQoJU3RvcmVGUFIoZmQsIGZtdCwgZmxvYXRf c3ViKFZhbHVlRlBSKGZzLCBmbXQpLCBWYWx1ZUZQUihmdCwgZm10KSkpOw0KDQovKiBTVUJVIFN1 YnRyYWN0IFVuc2lnbmVkIFdvcmQNCiAqLw0KMDAwMDAwIHJzKDUpIHJ0KDUpIHJkKDUpIDAwMDAw IDEwMDAxMToNCglpZiAoTm90V29yZFZhbHVlKEdQUltyc10pIHx8IE5vdFdvcmRWYWx1ZShHUFJb cnRdKSkgew0KCQlVTlBSRURJQ1RBQkxFOw0KCX0NCglHUFJbcmRdID0gc2lnbl9leHRlbmQoKGlu dDMyX3QpR1BSW3JzXSAtIChpbnQzMl90KUdQUltydF0sIDMyKTsNCg0KLyogU1VYQzEgU3RvcmUg RG91Ymxld29yZCBJbmRleGVkIFVuYWxpZ25lZCBmcm9tIEZsb2F0aW5nIFBvaW50DQogKi8NCjAx MDAxMSBiYXNlKDUpIGluZGV4KDUpIGZzKDUpIDAwMDAwIDAwMTEwMToNCgl1aW50NjRfdCB2QWRk ciwgZG91Ymxld29yZDsNCgl2QWRkciA9IGJpdHMoR1BSW2Jhc2VdICsgR1BSW2luZGV4XSwzLDYz KSA8PCAzOw0KCWRvdWJsZXdvcmQgPSBWYWx1ZUZQUihmcywgVU5JTlRFUlBSRVRFRF9ET1VCTEVX T1JEKTsNCglTdG9yZU1lbW9yeSh2QWRkciwgRE9VQkxFV09SRCwgZG91Ymxld29yZCk7DQoNCi8q IFNXIFN0b3JlIFdvcmQNCiAqLw0KMTAxMDExIGJhc2UoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1 aW50NjRfdCB2QWRkcjsNCgl2QWRkciA9IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwg MTYpOw0KCWlmIChiaXRzKHZBZGRyLDAsMSkgIT0gMCkgew0KCQlTaWduYWxFeGNlcHRpb24oQWRk cmVzc0Vycm9yKTsNCgl9DQoJU3RvcmVNZW1vcnkodkFkZHIsIFdPUkQsIEdQUltydF0pOw0KDQoJ CQ0KLyogU1dDMSBTdG9yZSBXb3JkIGZyb20gRmxvYXRpbmcgUG9pbnQNCiAqLw0KMTExMDAxIGJh c2UoNSkgZnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRkciwgZG91Ymxld29yZDsNCgl2 QWRkciA9IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwgMTYpOw0KCWlmIChiaXRzKHZB ZGRyLDAsMSkgIT0gMCkgew0KCQlTaWduYWxFeGNlcHRpb24oQWRkcmVzc0Vycm9yKTsNCgl9DQoJ ZG91Ymxld29yZCA9IFZhbHVlRlBSKGZ0LCBVTklOVEVSUFJFVEVEX1dPUkQpOw0KCVN0b3JlTWVt b3J5KHZBZGRyLCBXT1JELCBkb3VibGV3b3JkKTsNCg0KLyogU1dDMiBTdG9yZSBXb3JkIGZyb20g Q29wcm9jZXNzb3IgMg0KICovDQoxMTEwMTAgYmFzZSg1KSBydCg1KSBvZmZzZXQoMTYpOg0KCVNp Z25hbEV4Y2VwdGlvbihVbmltcGxlbWVudGVkKTsNCg0KLyogU1dMIFN0b3JlIFdvcmQgTGVmdA0K ICovDQoxMDEwMTAgYmFzZSg1KSBydCg1KSBvZmZzZXQoMTYpOg0KCXVpbnQ2NF90IHZBZGRyOw0K CWludCBieXRlOw0KCXZBZGRyID0gR1BSW2Jhc2VdICsgc2lnbl9leHRlbmQob2Zmc2V0LCAxNik7 DQoJYnl0ZSA9IFdPUkQgLSBiaXRzKHZBZGRyLDAsMSk7DQoJU3RvcmVNZW1vcnkodkFkZHIsIGJ5 dGUsIEdQUltydF0gPj4gKDgqKFdPUkQtYnl0ZSkpKTsNCg0KLyogU1dSIFN0b3JlIFdvcmQgUmln aHQNCiAqLw0KMTAxMTEwIGJhc2UoNSkgcnQoNSkgb2Zmc2V0KDE2KToNCgl1aW50NjRfdCB2QWRk cjsNCglpbnQgYnl0ZTsNCgl2QWRkciA9IEdQUltiYXNlXSArIHNpZ25fZXh0ZW5kKG9mZnNldCwg MTYpOw0KCWJ5dGUgPSBiaXRzKHZBZGRyLDAsMSkgKyAxOw0KCVN0b3JlTWVtb3J5KHZBZGRyICYg fjMsIGJ5dGUsIEdQUltydF0gPj4gKDgqKFdPUkQtYnl0ZSkpKTsNCg0KLyogU1dYQzEgU3RvcmUg V29yZCBJbmRleGVkIGZyb20gRmxvYXRpbmcgUG9pbnQNCiAqLw0KMDEwMDExIGJhc2UoNSkgaW5k ZXgoNSkgZnMoNSkgMDAwMDAgMDAxMDAwOg0KCXVpbnQ2NF90IHZBZGRyLCBkb3VibGV3b3JkOw0K CXZBZGRyID0gR1BSW2Jhc2VdICsgR1BSW2luZGV4XTsNCglpZiAoYml0cyh2QWRkciwwLDIpICE9 IDApIHsNCgkJU2lnbmFsRXhjZXB0aW9uKEFkZHJlc3NFcnJvcik7DQoJfQ0KCWRvdWJsZXdvcmQg PSBWYWx1ZUZQUihmcywgVU5JTlRFUlBSRVRFRF9XT1JEKTsNCglTdG9yZU1lbW9yeSh2QWRkciwg V09SRCwgZG91Ymxld29yZCk7DQoNCi8qIFNZTkMgU3luY2hvbml6ZSBTaGFyZWQgTWVtb3J5DQog Ki8NCjAwMDAwMCAwMDAwMCAwMDAwMCAwMDAwMCBzdHlwZSg1KSAwMDExMTE6DQoJLyogU3luY09w ZXJhdGlvbihzdHlwZSk7ICovDQoNCi8qIFNZU0NBTEwgU3lzdGVtIENhbGwNCiAqLw0KMDAwMDAw IGNvZGUoMjApIDAwMTEwMDoNCglTaWduYWxFeGNlcHRpb24oU3lzdGVtQ2FsbCk7DQoNCi8qIFRF USBUcmFwIGlmIEVxdWFsDQogKi8NCjAwMDAwMCBycyg1KSBydCg1KSBjb2RlKDEwKSAxMTAxMDA6 DQoJaWYgKEdQUltyc10gPT0gR1BSW3J0XSkgew0KCQlTaWduYWxFeGNlcHRpb24oVHJhcCk7DQoJ fQ0KDQovKiBURVFJIFRyYXAgaWYgRXF1YWwgSW1tZWRpYXRlDQogKi8NCjAwMDAwMSBycyg1KSAw MTEwMCBpbW1lZGlhdGUoMTYpOg0KCWlmIChHUFJbcnNdID09IHNpZ25fZXh0ZW5kKGltbWVkaWF0 ZSwgMTYpKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihUcmFwKTsNCgl9DQoNCi8qIFRHRSBUcmFwIGlm IEdyZWF0ZXIgb3IgRXF1YWwNCiAqLw0KMDAwMDAwIHJzKDUpIHJ0KDUpIGNvZGUoMTApIDExMDAw MDoNCglpZiAoKGludDY0X3QpR1BSW3JzXSA+PSAoaW50NjRfdClHUFJbcnRdKSB7DQoJCVNpZ25h bEV4Y2VwdGlvbihUcmFwKTsNCgl9DQoNCi8qIFRHRUkgVHJhcCBpZiBHcmVhdGVyIG9yIEVxdWFs IEltbWVkaWF0ZQ0KICovDQowMDAwMDEgcnMoNSkgMDEwMDAgaW1tZWRpYXRlKDE2KToNCglpZiAo KGludDY0X3QpR1BSW3JzXSA+PSAoaW50NjRfdClzaWduX2V4dGVuZChpbW1lZGlhdGUsIDE2KSkg ew0KCQlTaWduYWxFeGNlcHRpb24oVHJhcCk7DQoJfQ0KDQovKiBUR0VJVSBUcmFwIGlmIEdyZWF0 b3Igb3IgRXF1YWwgSW1tZWRpYXRlIFVuc2lnbmVkDQogKi8NCjAwMDAwMSBycyg1KSAwMTAwMSBp bW1lZGlhdGUoMTYpOg0KCWlmIChHUFJbcnNdID49IHNpZ25fZXh0ZW5kKGltbWVkaWF0ZSwgMTYp KSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihUcmFwKTsNCgl9DQoJDQovKiBUR0VVIFRyYXAgaWYgR3Jl YXRlciBvciBFcXVhbCBVbnNpZ25lZA0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgY29kZSgxMCkg MTEwMDAxOg0KCWlmIChHUFJbcnNdID49IEdQUltydF0pIHsNCgkJU2lnbmFsRXhjZXB0aW9uKFRy YXApOw0KCX0NCg0KLyogVExCUCBQcm9iZSBUTEIgZm9yIE1hdGNoaW5nIEVudHJ5DQogKi8NCjAx MDAwMCAxIDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAgMDAxMDAwOg0KCVNpZ25hbEV4Y2VwdGlvbihV bmltcGxlbWVudGVkKTsNCg0KLyogVExCUiBSZWFkIEluZGV4ZWQgVExCIEVudHJ5DQogKi8NCjAx MDAwMCAxIDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAxOg0KCVNpZ25hbEV4Y2VwdGlvbihV bmltcGxlbWVudGVkKTsNCg0KLyogVExCV0kgV3JpdGUgSW5kZXhlZCBUTEIgRW50cnkNCiAqLw0K MDEwMDAwIDEgMDAwMCAwMDAwMCAwMDAwMCAwMDAwMCAwMDAwMTA6DQoJU2lnbmFsRXhjZXB0aW9u KFVuaW1wbGVtZW50ZWQpOw0KDQovKiBUTEJXUiBXcml0ZSBSYW5kb20gVExCIEVudHJ5DQogKi8N CjAxMDAwMCAxIDAwMDAgMDAwMDAgMDAwMDAgMDAwMDAgMDAwMTEwOg0KCVNpZ25hbEV4Y2VwdGlv bihVbmltcGxlbWVudGVkKTsNCg0KLyogVExUIFRyYXAgaWYgTGVzcyBUaGFuDQogKi8NCjAwMDAw MCBycyg1KSBydCg1KSBjb2RlKDEwKSAxMTAwMTA6DQoJaWYgKChpbnQ2NF90KUdQUltyc10gPCAo aW50NjRfdClHUFJbcnRdKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihUcmFwKTsNCgl9DQoNCi8qIFRM VEkgVHJhcCBpZiBMZXNzIFRoYW4gSW1tZWRpYXRlDQogKi8NCjAwMDAwMSBycyg1KSAwMTAxMCBp bW1lZGlhdGUoMTYpOg0KCWlmICgoaW50NjRfdClHUFJbcnNdIDwgKGludDY0X3Qpc2lnbl9leHRl bmQoaW1tZWRpYXRlLCAxNikpIHsNCgkJU2lnbmFsRXhjZXB0aW9uKFRyYXApOw0KCX0NCg0KLyog VExUSU8gVHJhcCBpZiBMZXNzIFRoYW4gSW1tZWRpYXRlIFVuc2lnbmVkDQogKi8NCjAwMDAwMSBy cyg1KSAwMTAxMSBpbW1lZGlhdGUoMTYpOg0KCWlmIChHUFJbcnNdIDwgc2lnbl9leHRlbmQoaW1t ZWRpYXRlLCAxNikpIHsNCgkJU2lnbmFsRXhjZXB0aW9uKFRyYXApOw0KCX0NCg0KLyogVExUVSBU cmFwIGlmIExlc3MgVGhhbiBVbnNpZ25lZA0KICovDQowMDAwMDAgcnMoNSkgcnQoNSkgY29kZSgx MCkgMTEwMDExOg0KCWlmIChHUFJbcnNdIDwgR1BSW3J0XSkgew0KCQlTaWduYWxFeGNlcHRpb24o VHJhcCk7DQoJfQ0KDQovKiBUTkUgVHJhcCBpZiBOb3QgRXF1YWwNCiAqLw0KMDAwMDAwIHJzKDUp IHJ0KDUpIGNvZGUoMTApIDExMDExMDoNCglpZiAoR1BSW3JzXSAhPSBHUFJbcnRdKSB7DQoJCVNp Z25hbEV4Y2VwdGlvbihUcmFwKTsNCgl9DQoNCi8qIFRORUkgVHJhcCBpZiBOb3QgRXF1YWwgSW1t ZWRpYXRlDQogKi8NCjAwMDAwMSBycyg1KSAwMTExMCBpbW1lZGlhdGUoMTYpOg0KCWlmIChHUFJb cnNdICE9IHNpZ25fZXh0ZW5kKGltbWVkaWF0ZSwgMTYpKSB7DQoJCVNpZ25hbEV4Y2VwdGlvbihU cmFwKTsNCgl9DQoNCi8qIFRSVU5DLkwuZm10IEZsb2F0aW5nIFBvaW50IFRydW5jYXRlIHRvIExv bmcgRml4ZWQgUG9pbnQNCiAqLw0KMDEwMDAxIGZtdCg1KSAwMDAwMCBmcyg1KSBmZCg1KSAwMDEw MDE6DQoJU3RvcmVGUFIoZmQsIEwsIENvbnZlcnRGbXQoVmFsdWVGUFIoZnMsIGZtdCksIGZtdCwg TCkpOw0KDQovKiBUUlVOQy5XLmZtdCBGbG9hdGluZyBQb2ludCB0cnVuY2F0ZSB0byBXb3JkIEZp eGVkIFBvaW50DQogKi8NCjAxMDAwMSBmbXQoNSkgMDAwMDAgZnMoNSkgZmQoNSkgMDAxMTAxOg0K CVN0b3JlRlBSKGZkLCBXLCBDb252ZXJ0Rm10KFZhbHVlRlBSKGZzLCBmbXQpLCBmbXQsIFcpKTsN Cg0KLyogV0FJVCBFbnRlciBTdGFuZGJ5IE1vZGUNCiAqLw0KMDEwMDAwIDEgY29kZSgxOSkgMTAw MDAwOg0KCVdhaXRGb3JJbnRlcnJ1cHQoY29kZSk7DQoNCi8qIFhPUiBFeGNsdXNpdmUgT3INCiAq Lw0KMDAwMDAwIHJzKDUpIHJ0KDUpIHJkKDUpIDAwMDAwIDEwMDExMDoNCglHUFJbcmRdID0gR1BS W3JzXSBeIEdQUltydF07DQoNCi8qIFhPUkkgRXhjbHVzaXZlIE9yIEltbWVkaWF0ZQ0KICovDQow MDExMTAgcnMoNSkgcnQoNSkgaW1tZWRpYXRlKDE2KToNCglHUFJbcnRdID0gR1BSW3JzXSBeIHpl cm9fZXh0ZW5kKGltbWVkaWF0ZSwgMTYpOw0KDQovKiBBREQuZm10IEFkZCBGbG9hdA0KICogVGhp cyBpcyBhdCB0aGUgZW5kLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBtaXNzIHNvbWUgb2YgdGhlDQog KiAicHVsbCBjcnVkIGZyb20gRlBVIHNwZWNpYWwgcmVnaXN0ZXJzIiBpbnN0cnVjdGlvbnMuDQog Ki8NCjAxMDAwMSBmbXQoNSkgZnQoNSkgZnMoNSkgZmQoNSkgMDAwMDAwOg0KCVN0b3JlRlBSKGZk LCBmbXQsIGZsb2F0X2FkZChWYWx1ZUZQUihmcywgZm10KSxWYWx1ZUZQUihmdCwgZm10KSkpOw0K DQoNCj== --=-gAe26Sb24SVO7CLEhNfz Content-Disposition: attachment; filename=spec2c.pl Content-Type: application/x-perl; name=spec2c.pl Content-Transfer-Encoding: base64 IyEvdXNyL2Jpbi9wZXJsCiMKIwoKc3ViIHVzYWdlIHsKCXByaW50IFNUREVSUiAkMC4iIG1hY2hp bmVcbiI7CglyZXR1cm47Cn0KCnN1YiBoZWFkZXJmaWxlIHsKCW15KCRhcmNoKSA9IEBfOwoKCW9w ZW4oSEZJTEUsICI+ICRhcmNoLmgiKSB8fCBkaWUgIkNhbid0IG9wZW4gJGFyY2guaDogJCEiOwoJ cHJpbnQgSEZJTEUgPDxFT0Y7CiNpZm5kZWYgSU5TVF8kYXJjaAojZGVmaW5lIElOU1RfJGFyY2gK CiNpbmNsdWRlICJiaXRzLmgiCiNpbmNsdWRlICJpbnN0LmgiCiNpbmNsdWRlICIkYXJjaFxfYXJj aC5oIgoKZXh0ZXJuIHN0cnVjdCBpbnN0XzMyZmxhdF9zIEluc3RfJGFyY2hcW107CgppbnQgQ3B1 XyRhcmNoKHZvaWQgKm1lbW9yeSwgdWludDY0X3QgcGMsIHVpbnQ2NF90IHNwKTsKCiNlbmRpZiAv KiBJTlNUXyRhcmNoICovCkVPRgoJY2xvc2UoSEZJTEUpOwp9CgpzdWIgYmluMmhleCB7CglteSgk YmluKSA9IEBfOwoKCW15ICR2YWwsJGk7CglteShAYml0cyk9c3BsaXQoLy8sJGJpbik7Cglmb3Ig KCRpID0gMDsgJGkgPCBAYml0czsgJGkrKykgewoJCSR2YWwgPDw9IDE7CgkJJHZhbCArPSAkYml0 c1skaV07Cgl9CgoJcmV0dXJuIHNwcmludGYoIiV4IiwkdmFsKTsKfQoKc3ViIG1haW4gewoJbXko JGFyY2gpID0gQF87CgoJaWYgKCAkYXJjaCBlcSAnJykgewoJCSZ1c2FnZTsKCQlyZXR1cm4gMTsK CX0KCglteSgkaSxATWFzayxAWmVybyk7CgkkTWFza1swXT0nJzsKCWZvciAoJGkgPSAxOyAkaSA8 IDMyOyAkaSsrKSB7CgkJJE1hc2tbJGldPSRNYXNrWyRpLTFdLicxJzsKCQkkWmVyb1skaV09JFpl cm9bJGktMV0uJzAnOwoJfQoKCW9wZW4oU1BFQ0ZJTEUsICI8ICRhcmNoLnNwZWMiKSB8fCBkaWUg IkNhbid0IG9wZW4gJGFyY2guc3BlYzogJCEiOwoKCSZoZWFkZXJmaWxlKCRhcmNoKTsKCglvcGVu KENGSUxFLCAiPiAkYXJjaC5jIikgfHwgZGllICJDYW4ndCBvcGVuICRhcmNoLmM6ICQhIjsKCXBy aW50IENGSUxFICIjaW5jbHVkZSBcIiRhcmNoLmhcIlxuIjsKCglteSgkbGluZSwkZnVuYywkZCwk Y29tbWVudCwkZnVuY19zdGFydCk7CglteSBAbWFwOwoJd2hpbGUgKCRsaW5lID0gPFNQRUNGSUxF PikgewoJCWlmICgkbGluZSA9fiAvXlwvXCovKSB7CgkJCSgkZCwkZnVuYywkY29tbWVudCkgPSBz cGxpdCgvIC8sJGxpbmUsMyk7CgkJfQoKCQlpZiAoJGxpbmUgPX4gL15bMDFdLio6LykgewoJCQlt eSgkbWF0Y2gsJGp1bmspPXNwbGl0KC86LywkbGluZSk7CgkJCW15KEBhcmdzKT1zcGxpdCgvXHMr LywkbWF0Y2gpOwoJCQlteSgkbWFzaywkY29tcGFyZSxAcmVncyk7CgkJCWZvcmVhY2ggJG1hdGNo IChAYXJncykgewoJCQkJaWYgKCRtYXRjaCA9fiAvXlswMV0vKSB7CgkJCQkJJG1hc2sgLj0gJE1h c2tbbGVuZ3RoKCRtYXRjaCldOwoJCQkJCSRjb21wYXJlIC49ICRtYXRjaDsKCQkJCX0gZWxzZSB7 CgkJCQkJbXkoJHZhciwkbGVuKT1zcGxpdCgvW1woXCldLywkbWF0Y2gpOwoJCQkJCXB1c2ggQHJl Z3MseyduYW1lJz0+JHZhciwnZW5kJz0+MzEtbGVuZ3RoKCRtYXNrKSwnc3RhcnQnPT4zMS1sZW5n dGgoJG1hc2spLSRsZW4rMX07CgkJCQkJJG1hc2sgLj0gJFplcm9bJGxlbl07CgkJCQkJJGNvbXBh cmUgLj0gJFplcm9bJGxlbl07CgkJCQl9CgkJCX0KCQkJaWYgKGxlbmd0aCgkbWFzaykgIT0gMzIg fHwgbGVuZ3RoKCRjb21wYXJlKSAhPSAzMikgewoJCQkJcHJpbnQgU1RERVJSICJNYXRjaCBkZWZp bml0aW9uIGZvciAkZnVuYyBpcyBpbmNvcnJlY3Q6XG4iLiRsaW5lOwoJCQkJZXhpdCgxKTsKCQkJ fQoJCQkkZnVuYyA9fiBzL1tcLlwvXS9fL2c7CgkJCSRmdW5jX3N0YXJ0PTE7CgkJCXB1c2ggQG1h cCx7J2Z1bmMnPT4kYXJjaC4iXyIuJGZ1bmMsJ21hc2snPT4kbWFzaywnY29tcGFyZSc9PiRjb21w YXJlLCdyZWdzJz0+XEByZWdzfTsKCQkJcHJpbnQgQ0ZJTEUgInN0YXRpYyB2b2lkICRhcmNoIi4i XyIuIiRmdW5jKENQVV90IHBjcHUsIHVpbnQzMl90IGluc3RydWN0aW9uKVxuIjsKCQkJcHJpbnQg Q0ZJTEUgIntcblx0JGFyY2hcX0NQVV90IGNwdT1wY3B1O1xuIjsKCQkJbXkoQHZhbHMsQGZtdCk7 CgkJCWZvcmVhY2ggJGkgKEByZWdzKSB7CgkJCQlwcmludCBDRklMRSAiXHRpbnQgIi4kaS0+eydu YW1lJ30uIj1iaXRzKGluc3RydWN0aW9uLCIuJGktPnsnc3RhcnQnfS4iLCIuJGktPnsnZW5kJ30u Iik7XG4iOwoJCQkJcHVzaCBAdmFscywkaS0+eyduYW1lJ307CgkJCQlwdXNoIEBmbXQsJGktPnsn bmFtZSd9Lic9JWQnOwoJCQl9CgkJCXByaW50IENGSUxFICJcdERFQlVHX01TRyhEX0lOU1QsXCIk ZnVuYyAiLmpvaW4oIiwiLEBmbXQpLiJcXG5cIiI7CgkJCWlmICggQHZhbHMgPiAwKSB7CgkJCQlw cmludCBDRklMRSAiLCIuam9pbigiLCIsQHZhbHMpOwoJCQl9CgkJCXByaW50IENGSUxFICIpO1xu IjsKCQkJcHJpbnQgQ0ZJTEUgIlx0e1xuIjsKCQkJbmV4dDsKCQl9CgoJCWlmICgkbGluZSA9fiAv XlxzKiQvICYmICRmdW5jX3N0YXJ0KSB7CgkJCXByaW50IENGSUxFICJcdH1cbiI7CgkJCXByaW50 IENGSUxFICJ9XG4iOwoJCQkkZnVuY19zdGFydD0wOwoJCX0KCgkJcHJpbnQgQ0ZJTEUgJGxpbmU7 Cgl9CgoJcHJpbnQgQ0ZJTEUgIlxuXG5zdHJ1Y3QgaW5zdF8zMmZsYXRfcyBJbnN0XyIuJGFyY2gu IlsiLihAbWFwKzEpLiJdPXtcbiI7Cglmb3JlYWNoICRpIChAbWFwKSB7CgkJcHJpbnQgQ0ZJTEUg Ilx0eyAiLiRpLT57J2Z1bmMnfS4iLCAweCIuYmluMmhleCgkaS0+eydtYXNrJ30pLiIsIDB4Ii5i aW4yaGV4KCRpLT57J2NvbXBhcmUnfSkuIiB9LFxuIjsKCX0KCXByaW50IENGSUxFICJcdHsgTlVM TCwgMCwgMCB9XG59O1xuIjsKCWNsb3NlKFNQRUNGSUxFKTsKCWNsb3NlKENGSUxFKTsKCglyZXR1 cm4gMDsKfQoKCmV4aXQgJm1haW4oJEFSR1ZbMF0pOwo= --=-gAe26Sb24SVO7CLEhNfz-- --=-T0qSQ8qqDwnv9/Q+GNow Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQBCCltN8/0vJ5szK6kRArpXAKDIIQQ3KXrjj/OLpTmNphf4+jO3VACfSUEM Yy0ems9fC3uBq/cXU8vjfPo= =8o2c -----END PGP SIGNATURE----- --=-T0qSQ8qqDwnv9/Q+GNow--