From mboxrd@z Thu Jan 1 00:00:00 1970 Message-Id: <5.1.0.14.0.20010812233754.00a60bf0@pop.wanadoo.fr> To: 9fans@cse.psu.edu From: Philippe Anel Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_273202==_" Subject: [9fans] (no subject) Date: Sun, 12 Aug 2001 23:38:27 +0200 Topicbox-Message-UUID: da7f4bd8-eac9-11e9-9e20-41e7f4b1d025 --=====================_273202==_ Content-Type: text/plain; charset="us-ascii"; format=flowed Hi everybody out there, I took the last week to write a driver for my Matrox G400. I'll send another files this week to support the G450. I think it wouldn't take much work to enhance the actual driver so that it supports the G200 serie. I'll give it a try once I get hold of this card (around the end of august). I'm currently working on the 2d accel feature (which isn't supported as of yet). Though, the source code isn't very clean, and probably needs a complete rewrite, It works fairly well on my computer. I'll rewrite it properly some time later. At now, there only the 8 bits mode which works correctly. (Quite a lot of misfeatures in the end :() Now, is there any project around regarding the OpenGL support ?, also, for the Overlays support ?. Does someone know about a driver beeing under developpment for the Radeon video card (ATI). Or if it is already supported. Either way, does/will it support 2D acceleration features ?. If none of this exists, I'd gladly start this project myself. I'll welcome any comment regarding this project. Regards, Philippe Anel, --=====================_273202==_ Content-Type: text/plain; name="vgamga4xx.c"; x-mac-type="42494E41"; x-mac-creator="74747874" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="vgamga4xx.c" LyogUGhpbGlwcGUgQW5lbCA6IHBoaWxpcHBlLmFuZWxAbm9vcy5mciAqLyAKCiNpbmNsdWRlICJ1 LmgiCiNpbmNsdWRlICIuLi9wb3J0L2xpYi5oIgojaW5jbHVkZSAibWVtLmgiCiNpbmNsdWRlICJk YXQuaCIKI2luY2x1ZGUgImZucy5oIgojaW5jbHVkZSAiaW8uaCIKI2luY2x1ZGUgIi4uL3BvcnQv ZXJyb3IuaCIKCiNkZWZpbmUJSW1hZ2UJSU1BR0UKI2luY2x1ZGUgPGRyYXcuaD4KI2luY2x1ZGUg PG1lbWRyYXcuaD4KI2luY2x1ZGUgPGN1cnNvci5oPgojaW5jbHVkZSAic2NyZWVuLmgiCgovKgog KiBNYXRyb3ggRzQwMCBhbmQgRzQ1MC4KICovCgplbnVtIHsKCS8qIHBjaSBjaGlwIG1hbnVmYWN0 dXJlciAqLwoJTUFUUk9YCQk9IDB4MTAyQiwKCgkvKiBhZ3AvcGNpIGNoaXAgZGV2aWNlIGlkICov CglNR0E0eHgJCT0gMHgwNTI1Cn07CgpzdGF0aWMgUGNpZGV2KgptZ2FwY2ltYXRjaCh2b2lkKQp7 CglQY2lkZXYqCXA7CgkKCXAgPSBwY2ltYXRjaChuaWwsIE1BVFJPWCwgTUdBNHh4KTsKCWlmICgw ICYmIHApCgkJcHJpbnQoIk1HQSA0eHggZm91bmQgOiByZXYgJWRcbiIsIHAtPnJpZCk7CglyZXR1 cm4gcDsKfQoKc3RhdGljIHVsb25nCm1nYTR4eGxpbmVhcihWR0FzY3IqIHNjciwgaW50KiBzaXpl LCBpbnQqIGFsaWduKQp7Cgl1bG9uZyBhcGVydHVyZSwgb2FwZXJ0dXJlOwoJaW50IG9hcHNpemUs IHdhc3VwYW1lbTsKCVBjaWRldiAqcDsKCglvYXBlcnR1cmUgPSBzY3ItPmFwZXJ0dXJlOwoJb2Fw c2l6ZSA9IHNjci0+YXBzaXplOwoJd2FzdXBhbWVtID0gc2NyLT5pc3VwYW1lbTsKCglpZihwID0g bWdhcGNpbWF0Y2goKSl7CgkJYXBlcnR1cmUgPSBwLT5tZW1bMF0uYmFyICYgfjB4MEY7CgkJKnNp emUgPSAzMioxMDI0KjEwMjQ7Cgl9CgllbHNlCgkJYXBlcnR1cmUgPSAwOwoKCWlmKHdhc3VwYW1l bSkgewoJCWlmKG9hcGVydHVyZSA9PSBhcGVydHVyZSkKCQkJcmV0dXJuIG9hcGVydHVyZTsKCQl1 cGFmcmVlKG9hcGVydHVyZSwgb2Fwc2l6ZSk7Cgl9CglzY3ItPmlzdXBhbWVtID0gMDsKCglhcGVy dHVyZSA9IHVwYW1hbGxvYyhhcGVydHVyZSwgKnNpemUsICphbGlnbik7CglpZihhcGVydHVyZSA9 PSAwKXsKCQlpZih3YXN1cGFtZW0gJiYgdXBhbWFsbG9jKG9hcGVydHVyZSwgb2Fwc2l6ZSwgMCkp IHsKCQkJYXBlcnR1cmUgPSBvYXBlcnR1cmU7CgkJCXNjci0+aXN1cGFtZW0gPSAxOwoJCX0KCQll bHNlCgkJCXNjci0+aXN1cGFtZW0gPSAwOwoJfQoJZWxzZQoJCXNjci0+aXN1cGFtZW0gPSAxOwoK CXJldHVybiBhcGVydHVyZTsKfQoKc3RhdGljIHZvaWQKbWdhNHh4ZW5hYmxlKFZHQXNjciogc2Ny KQp7CglQY2lkZXYgKglwOwoJUGh5c3NlZyAJc2VnOwoJaW50IAkJc2l6ZSwgYWxpZ247Cgl1bG9u ZyAJYXBlcnR1cmU7CgoJLyoKCSAqIE9ubHkgb25jZSwgY2FuJ3QgYmUgZGlzYWJsZWQgZm9yIG5v dy4KCSAqIHNjci0+aW8gaG9sZHMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZgoJICogdGhlIE1NSU8g cmVnaXN0ZXJzLgoJICovCglpZihzY3ItPmlvKQoJCXJldHVybjsKCglwID0gbWdhcGNpbWF0Y2go KTsKCWlmKHAgPT0gbmlsKQoJCXJldHVybjsKCglzY3ItPmlvID0gdXBhbWFsbG9jKHAtPm1lbVsx XS5iYXIgJiB+MHgwRiwgMTYqMTAyNCwgMCk7CglpZihzY3ItPmlvID09IDApCgkJcmV0dXJuOwoK CW1lbXNldCgmc2VnLCAwLCBzaXplb2Yoc2VnKSk7CglzZWcuYXR0ciA9IFNHX1BIWVNJQ0FMOwoJ c2VnLm5hbWUgPSBzbWFsbG9jKE5BTUVMRU4pOwoJc25wcmludChzZWcubmFtZSwgTkFNRUxFTiwg Im1nYTR4eG1taW8iKTsKCXNlZy5wYSA9IHNjci0+aW87CglzZWcuc2l6ZSA9IHAtPm1lbVsxXS5z aXplOwoJYWRkcGh5c3NlZygmc2VnKTsKCglzY3ItPmlvID0gKHVsb25nKUtBRERSKHNjci0+aW8p OwoKCS8qIG5lZWQgdG8gbWFwIGZyYW1lIGJ1ZmZlciBoZXJlIHRvbywgc28gdmdhIGNhbiBmaW5k IG1lbW9yeSBzaXplICovCglzaXplID0gMzIqMTAyNCoxMDI0OwoJYWxpZ24gPSAwOwoJYXBlcnR1 cmUgPSBtZ2E0eHhsaW5lYXIoc2NyLCAmc2l6ZSwgJmFsaWduKTsKCWlmKGFwZXJ0dXJlKSB7CgkJ c2NyLT5hcGVydHVyZSA9IGFwZXJ0dXJlOwoJCXNjci0+YXBzaXplID0gc2l6ZTsKCQltZW1zZXQo JnNlZywgMCwgc2l6ZW9mKHNlZykpOwoJCXNlZy5hdHRyID0gU0dfUEhZU0lDQUw7CgkJc2VnLm5h bWUgPSBzbWFsbG9jKE5BTUVMRU4pOwoJCXNucHJpbnQoc2VnLm5hbWUsIE5BTUVMRU4sICJtZ2E0 eHhzY3JlZW4iKTsKCQlzZWcucGEgPSBhcGVydHVyZTsKCQlzZWcuc2l6ZSA9IHNpemU7CgkJYWRk cGh5c3NlZygmc2VnKTsKCX0KfQoKZW51bSB7CglJbmRleAkJPSAweDAwLAkJLyogSW5kZXggKi8K CURhdGEJCT0gMHgwQSwJCS8qIERhdGEgKi8KCglDeGxzYgkJPSAweDBDLAkJLyogQ3Vyc29yIFgg TFNCICovCglDeG1zYgkJPSAweDBELAkJLyogQ3Vyc29yIFggTVNCICovCglDeWxzYgkJPSAweDBF LAkJLyogQ3Vyc29yIFkgTFNCICovCglDeW1zYgkJPSAweDBGLAkJLyogQ3Vyc29yIFkgTVNCICov CgoJSWN1cmFkcmwJPSAweDA0LAkJLyogQ3Vyc29yIEJhc2UgQWRkcmVzcyBMb3cgKi8JCglJY3Vy YWRyaAk9IDB4MDUsCQkvKiBDdXJzb3IgQmFzZSBBZGRyZXNzIEhpZ2ggKi8KCUljY3RsCQk9IDB4 MDYsCQkvKiBJbmRpcmVjdCBDdXJzb3IgQ29udHJvbCAqLwp9OwoKc3RhdGljIHZvaWQKZGFjNHh4 ZGlzYWJsZShWR0FzY3IqIHNjcikKewoJdWNoYXIgKiBkYWM0eHg7CgkKCWlmKHNjci0+aW8gPT0g MCkKCQlyZXR1cm47CgoJZGFjNHh4ID0gS0FERFIoc2NyLT5pbysweDNDMDApOwoJCgkqKGRhYzR4 eCtJbmRleCkgPSBJY2N0bDsKCSooZGFjNHh4K0RhdGEpID0gMHgwMDsKfQoKc3RhdGljIHZvaWQK ZGFjNHh4bG9hZChWR0FzY3IqIHNjciwgQ3Vyc29yKiBjdXJzKQp7CglpbnQgeCwgeTsKCXVjaGFy ICpwOwoJdWNoYXIgKiBkYWM0eHg7CgoJaWYoc2NyLT5pbyA9PSAwKQoJCXJldHVybjsKCglkYWM0 eHggPSBLQUREUihzY3ItPmlvKzB4M0MwMCk7CgkKCWRhYzR4eGRpc2FibGUoc2NyKTsKCglwID0g S0FERFIoc2NyLT5zdG9yYWdlKTsKCWZvcih5ID0gMDsgeSA8IDY0OyB5KyspewoJCSpwKysgPSAw OwoJCSpwKysgPSAwOwoJCSpwKysgPSAwOwoJCSpwKysgPSAwOwoJCSpwKysgPSAwOwoJCSpwKysg PSAwOwoJCWlmKHkgPDE2KXsKCQkJKnArKyA9IGN1cnMtPnNldFsxK3kqMl18Y3Vycy0+Y2xyWzEr Mip5XTsKCQkJKnArKyA9IGN1cnMtPnNldFt5KjJdfGN1cnMtPmNsclsyKnldOwoJCX0gZWxzZXsK CQkJKnArKyA9IDA7CgkJCSpwKysgPSAwOwoJCX0KCgkJKnArKyA9IDA7CgkJKnArKyA9IDA7CgkJ KnArKyA9IDA7CgkJKnArKyA9IDA7CgkJKnArKyA9IDA7CgkJKnArKyA9IDA7CgkJaWYoeSA8MTYp ewoJCQkqcCsrID0gY3Vycy0+c2V0WzEreSoyXTsKCQkJKnArKyA9IGN1cnMtPnNldFt5KjJdOwoJ CX0gZWxzZXsKCQkJKnArKyA9IDA7CgkJCSpwKysgPSAwOwoJCX0KCX0KCXNjci0+b2Zmc2V0Lngg PSA2NCArIGN1cnMtPm9mZnNldC54OwoJc2NyLT5vZmZzZXQueSA9IDY0ICsgY3Vycy0+b2Zmc2V0 Lnk7CgoJKihkYWM0eHgrSW5kZXgpID0gSWNjdGw7CgkqKGRhYzR4eCtEYXRhKSA9IDB4MDM7Cn0K CnN0YXRpYyBpbnQKZGFjNHh4bW92ZShWR0FzY3IqIHNjciwgUG9pbnQgcCkKewoJaW50IAl4LCB5 OwoJdWNoYXIgKglkYWM0eHg7CgoJaWYoc2NyLT5pbyA9PSAwKQoJCXJldHVybiAxOwoKCWRhYzR4 eCA9IEtBRERSKHNjci0+aW8gKyAweDNDMDApOwoKCXggPSBwLnggKyBzY3ItPm9mZnNldC54OwoJ eSA9IHAueSArIHNjci0+b2Zmc2V0Lnk7CgoJKihkYWM0eHgrQ3hsc2IpID0geCAmIDB4RkY7Cgkq KGRhYzR4eCtDeG1zYikgPSAoeD4+OCkgJiAweDBGOwoKCSooZGFjNHh4K0N5bHNiKSA9IHkgJiAw eEZGOwoJKihkYWM0eHgrQ3ltc2IpID0gKHk+PjgpICYgMHgwRjsKCglyZXR1cm4gMDsKfQoKc3Rh dGljIHZvaWQKZGFjNHh4ZW5hYmxlKFZHQXNjciogc2NyKQp7Cgl1Y2hhciAqCWRhYzR4eDsKCXVs b25nCXN0b3JhZ2U7CgkKCWlmKHNjci0+aW8gPT0gMCkKCQlyZXR1cm47CglkYWM0eHggPSBLQURE UihzY3ItPmlvKzB4M0MwMCk7CgoJZGFjNHh4ZGlzYWJsZShzY3IpOwoKCXN0b3JhZ2UgPSAoMzIq MTAyNCoxMDI0IC0gNDA5NikgJiB+MHgzZmY7CgoJKihkYWM0eHgrSW5kZXgpID0gSWN1cmFkcmw7 CgkqKGRhYzR4eCtEYXRhKSA9IDB4ZmYgJiAoc3RvcmFnZSA+PiAxMCk7CgkqKGRhYzR4eCtJbmRl eCkgPSBJY3VyYWRyaDsKCSooZGFjNHh4K0RhdGEpID0gMHhmZiAmIChzdG9yYWdlID4+IDE4KTsJ CQoKCXNjci0+c3RvcmFnZSA9ICh1bG9uZykgS0FERFIoKHVsb25nKXNjci0+YXBlcnR1cmUgKyAo dWxvbmcpc3RvcmFnZSk7CgoJLyogU2hvdyBYMTEtTGlrZSBDdXJzb3IgKi8KCSooZGFjNHh4K0lu ZGV4KSA9IEljY3RsOwoJKihkYWM0eHgrRGF0YSkgPSAweDAzOwoKCS8qIEN1cnNvciBDb2xvciAw IDogV2hpdGUgKi8KCSooZGFjNHh4K0luZGV4KSA9IDB4MDg7CgkqKGRhYzR4eCtEYXRhKSAgPSAw eGZmOwoJKihkYWM0eHgrSW5kZXgpID0gMHgwOTsKCSooZGFjNHh4K0RhdGEpICA9IDB4ZmY7Cgkq KGRhYzR4eCtJbmRleCkgPSAweDBhOwoJKihkYWM0eHgrRGF0YSkgID0gMHhmZjsKCgkvKiBDdXJz b3IgQ29sb3IgMSA6IEJsYWNrICovCgkqKGRhYzR4eCtJbmRleCkgPSAweDBjOwoJKihkYWM0eHgr RGF0YSkgID0gMHgwMDsKCSooZGFjNHh4K0luZGV4KSA9IDB4MGQ7CgkqKGRhYzR4eCtEYXRhKSAg PSAweDAwOwoJKihkYWM0eHgrSW5kZXgpID0gMHgwZTsKCSooZGFjNHh4K0RhdGEpICA9IDB4MDA7 CgoJLyogQ3Vyc29yIENvbG9yIDIgOiBSZWQgKi8KCSooZGFjNHh4K0luZGV4KSA9IDB4MTA7Cgkq KGRhYzR4eCtEYXRhKSAgPSAweGZmOwoJKihkYWM0eHgrSW5kZXgpID0gMHgxMTsKCSooZGFjNHh4 K0RhdGEpICA9IDB4MDA7CgkqKGRhYzR4eCtJbmRleCkgPSAweDEyOwoJKihkYWM0eHgrRGF0YSkg ID0gMHgwMDsKCgkvKgoJICogTG9hZCwgbG9jYXRlIGFuZCBlbmFibGUgdGhlCgkgKiA2NHg2NCBj dXJzb3IgaW4gMy1jb2xvdXIgbW9kZS4KCSAqLwoJZGFjNHh4bG9hZChzY3IsICZhcnJvdyk7Cglk YWM0eHhtb3ZlKHNjciwgWlApOwp9CgpWR0FkZXYgdmdhbWdhNHh4ZGV2ID0gewoJIm1nYTR4eCIs CgoJbWdhNHh4ZW5hYmxlLAkJLyogZW5hYmxlICovCgkwLAkJCS8qIGRpc2FibGUgKi8KCTAsCQkJ LyogcGFnZSAqLwoJbWdhNHh4bGluZWFyLAkJLyogbGluZWFyICovCn07CgpWR0FjdXIgdmdhbWdh NHh4Y3VyID0gewoJIm1nYTR4eGh3Z2MiLAoJZGFjNHh4ZW5hYmxlLAoJZGFjNHh4ZGlzYWJsZSwK CWRhYzR4eGxvYWQsCglkYWM0eHhtb3ZlLAp9Owo= --=====================_273202==_ Content-Type: text/plain; name="Mga4xx.c"; x-mac-type="42494E41"; x-mac-creator="74747874" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Mga4xx.c" LyogUGhpbGlwcGUgQW5lbCA6IHBoaWxpcHBlLmFuZWxAbm9vcy5mciAqLyAKCiNpbmNsdWRlIDx1 Lmg+CiNpbmNsdWRlIDxsaWJjLmg+CiNpbmNsdWRlIDxiaW8uaD4KCiNpbmNsdWRlICJ2Z2EuaCIK I2luY2x1ZGUgInBjaS5oIgoKLyoKICogTWF0cm94IEc0eHggM0QgZ3JhcGhpY3MgYWNjZWxlcmF0 b3JzCiAqLwplbnVtIHsKCUtpbG8JCQkJPSAxMDI0LAoJTWVnCQkJCT0gMTAyNCoxMDI0LAoJCglN QVRST1gJCQk9IDB4MTAyQiwJCS8qIHBjaSBjaGlwIG1hbnVmYWN0dXJlciAqLwoJTUdBNFhYCQkJ PSAweDA1MjUsCQkvKiBwY2kgY2hpcCBkZXZpY2UgaWRzICovCgoJLyogUGNpIGNvbmZpZ3VyYXRp b24gc3BhY2UgbWFwcGluZyAqLwoJUENmZ01nYUZCQUEJCT0gMHgxMCwJCS8qIEZyYW1lIGJ1ZmZl ciBBcGVydHVyZSBBZGRyZXNzICovCglQQ2ZnTWdhQ0FBCQk9IDB4MTQsCQkvKiBDb250cm9sIEFw ZXJ0dXJlIEFkZHJlc3MgYmFzZSAqLwoJUENmZ01nYUlBQQkJPSAweDE4LAkJLyogSUxPQUQgQXBl cnR1cmUgYmFzZSBBZGRyZXNzICovCglQQ2ZnTWdhT3B0aW9uMQk9IDB4NDAsCQkvKiBPcHRpb24g UmVnaXN0ZXIgMSAqLwoJUENmZ01nYU9wdGlvbjIJPSAweDUwLAkJLyogT3B0aW9uIFJlZ2lzdGVy IDIgKi8KCVBDZmdNZ2FPcHRpb24zCT0gMHg1NCwJCS8qIE9wdGlvbiBSZWdpc3RlciAzICovCglQ Q2ZnTWdhRGV2Q3RybAk9IDB4MDQsCQkvKiBEZXZpY2UgQ29udHJvbCAqLwoKCS8qIGNvbnRyb2wg YXBlcnR1cmUgb2Zmc2V0cyAqLwoJRE1BV0lOCQkJPSAweDAwMDAsCQkvKiA3S0J5dGUgUHNldWRv LURNQSBXaW5kb3cgKi8KCglTVEFUVVMwCQkJPSAweDFGQzIsCQkvKiBJbnB1dCBTdGF0dXMgMCAq LwoJU1RBVFVTMQkJCT0gMHgxRkRBLAkvKiBJbnB1dCBTdGF0dXMgMSAqLwoJCglTRVFJRFgJCQk9 IDB4MUZDNCwJCS8qIFNlcXVlbmNlciBJbmRleCAqLwoJU0VRREFUQQkJCT0gMHgxRkM1LAkJLyog U2VxdWVuY2VyIERhdGEgKi8KCglNSVNDX1cJCQk9IDB4MUZDMiwJCS8qIE1pc2MuIFdPICovCglN SVNDX1IJCQk9IDB4MUZDQywJLyogTWlzYy4gUk8gKi8KCglHQ1RMSURYCQkJPSAweDFGQ0UsCQkv KiBHcmFwaGljIENvbnRyb2xlciBJbmRleCAqLwoJR0NUTERBVEEJCT0gMHgxRkNGLAkJLyogR3Jh cGhpYyBDb250cm9sZXIgRGF0YSAqLwoKCUNSVENJRFgJCQk9IDB4MUZENCwJLyogQ1JUQyBJbmRl eCAqLwoJQ1JUQ0RBVEEJCT0gMHgxRkQ1LAkvKiBDUlRDIERhdGEgKi8KCglDUlRDRVhUSURYCQk9 IDB4MUZERSwJCS8qIENSVEMgRXh0ZW5zaW9uIEluZGV4ICovCglDUlRDRVhUREFUQQkJPSAweDFG REYsCQkvKiBDUlRDIEV4dGVuc2lvbiBEYXRhICovCgkKCVJBTURBQ0lEWAkJPSAweDNDMDAsCS8q IFJBTURBQyByZWdpc3RlcnMgSW5kZXggKi8KCVJBTURBQ0RBVEEJCT0gMHgzQzBBLAkvKiBSQU1E QUMgSW5kZXhlZCBEYXRhICovCglSQU1EQUNQQUxEQVRBCQk9IDB4M0MwMSwKCglBVFRSSURYCQkJ PSAweDFGQzAsCQkvKiBBdHRyaWJ1dGUgSW5kZXggKi8KCUFUVFJEQVRBCQk9IDB4MUZDMSwJCS8q IEF0dHJpYnV0ZSBEYXRhICovCgoJQ0FDSEVGTFVTSAkJPSAweDFGRkYsCgoJQzJfQ1RMCQkJPSAw WDNDMTAsCglNR0FfU1RBVFVTCQk9IDBYMUUxNCwKCVpfREVQVEhfT1JHCQk9IDBYMUMwQywKCQp9 OwoKdHlwZWRlZiBzdHJ1Y3QgewoJUGNpZGV2KglwY2k7CglpbnQJCWRldmlkOwoJaW50CQlyZXZp ZDsKCQoJdWxvbmcJbW1pbzsKCXVsb25nCW1tZmI7CglpbnQJCWZic2l6ZTsKCXVsb25nCWlsb2Fk OwoKCXVjaGFyCXN5c3BsbF9tOwoJdWNoYXIJc3lzcGxsX247Cgl1Y2hhcglzeXNwbGxfcDsKCXVj aGFyCXN5c3BsbF9zOwoKCXVjaGFyCXBpeHBsbF9tOwoJdWNoYXIJcGl4cGxsX247Cgl1Y2hhcglw aXhwbGxfcDsKCXVjaGFyCXBpeHBsbF9zOwoKCXVsb25nCW9wdGlvbjE7Cgl1bG9uZwlvcHRpb24y OwoJdWxvbmcJb3B0aW9uMzsKCgkvKiBGcm9tIHBsYW45LmluaSAqLwoJdWNoYXIJc2RyYW07Cgl1 Y2hhcgljb2xvcmtleTsKCXVjaGFyCW1hc2trZXk7Cgl1bG9uZwltYXhwY2xrOwoKCXVjaGFyCWdy YXBoaWNzWzldOwkKCXVjaGFyCWF0dHJpYnV0ZVsweDE0XTsJCgl1Y2hhcglzZXF1ZW5jZXJbNV07 Cgl1Y2hhcgljcnRjWzB4MTldOwoJdWNoYXIJY3J0Y2V4dFs5XTsKCgl1bG9uZwlodG90YWw7Cgl1 bG9uZwloZGlzcGVuZDsKCXVsb25nCWhibGtzdHI7Cgl1bG9uZwloYmxrZW5kOwoJdWxvbmcJaHN5 bmNzdHI7Cgl1bG9uZwloc3luY2VuZDsKCXVsb25nCXZ0b3RhbDsKCXVsb25nCXZkaXNwZW5kOwoJ dWxvbmcJdmJsa3N0cjsKCXVsb25nCXZibGtlbmQ7Cgl1bG9uZwl2c3luY3N0cjsKCXVsb25nCXZz eW5jZW5kOwoJdWxvbmcJbGluZWNvbXA7Cgl1bG9uZwloc3luY3NlbDsKCXVsb25nCXN0YXJ0YWRk OwoJdWxvbmcJb2Zmc2V0OwoJdWxvbmcJbWF4c2NhbjsKCXVsb25nIAljdXJsb2M7Cgl1bG9uZwlw cm93c2NhbjsKCXVsb25nCWN1cnJvd3N0cjsKCXVsb25nCWN1cnJvd2VuZDsKCXVsb25nCWN1cm9m ZjsKCXVsb25nCXVuZHJvdzsKCXVsb25nCWN1cnNrZXc7Cgl1bG9uZwljb252MnQ0OwoJdWxvbmcJ aW50ZXJsYWNlOwoJdWxvbmcJaHN5bmNkZWw7Cgl1bG9uZwloZGlzcHNrZXc7Cgl1bG9uZwlieXRl cGFuOwoJdWxvbmcJZG90Y2xrcnQ7Cgl1bG9uZwlkd29yZDsKCXVsb25nCXdibW9kZTsKCXVsb25n CWFkZHdyYXA7Cgl1bG9uZwlzZWxyb3dzY2FuOwoJdWxvbmcJY21zOwoJdWxvbmcJY3N5bmNjZW47 Cgl1bG9uZwlocnN0ZW47Cgl1bG9uZwl2cnN0ZW47Cgl1bG9uZwl2aW50ZW47Cgl1bG9uZwl2aW50 Y2xyOwoJdWxvbmcJaHN5bmNvZmY7Cgl1bG9uZwl2c3luY29mZjsKCXVsb25nCWNydGNyc3ROOwoJ dWxvbmcJbWdhbW9kZTsKCXVsb25nCXNjYWxlOwoJdWxvbmcJaGlwcmlsdmw7Cgl1bG9uZwltYXho aXByaTsKCXVsb25nCWMyaGlwcmlsdmw7Cgl1bG9uZwljMm1heGhpcHJpOwoJdWxvbmcJbWlzYzsK CXVsb25nCWNydGNwcm90ZWN0OwoJdWxvbmcJd2luc2l6ZTsKCXVsb25nCXdpbmZyZXE7Cn0gTWdh OwoKCnN0YXRpYyB2b2lkCm1nYXdyaXRlMzIoTWdhKiBtZ2EsIGludCBpbmRleCwgdWxvbmcgdmFs KQp7CgkoKHVsb25nKiltZ2EtPm1taW8pW2luZGV4XSA9IHZhbDsKfQoKc3RhdGljIHVsb25nCm1n YXJlYWQzMihNZ2EqIG1nYSwgaW50IGluZGV4KQp7CglyZXR1cm4gKCh1bG9uZyopbWdhLT5tbWlv KVtpbmRleF07Cn0KCnN0YXRpYyB2b2lkCm1nYXdyaXRlOChNZ2EqIG1nYSwgaW50IGluZGV4LCB1 Y2hhciB2YWwpCnsKCSgodWNoYXIqKW1nYS0+bW1pbylbaW5kZXhdID0gdmFsOwp9CgpzdGF0aWMg dWNoYXIKbWdhcmVhZDgoTWdhKiBtZ2EsIGludCBpbmRleCkKewoJcmV0dXJuICgodWNoYXIqKW1n YS0+bW1pbylbaW5kZXhdOwp9CgpzdGF0aWMgdWNoYXIKc2VxZ2V0KE1nYSogbWdhLCBpbnQgaW5k ZXgpCnsKCW1nYXdyaXRlOChtZ2EsIFNFUUlEWCwgaW5kZXgpOwoJcmV0dXJuIG1nYXJlYWQ4KG1n YSwgU0VRREFUQSk7Cn0KCnN0YXRpYyB1Y2hhcgpzZXFzZXQoTWdhKiBtZ2EsIGludCBpbmRleCwg dWNoYXIgc2V0LCB1Y2hhciBjbHIpCnsKCXVjaGFyCXRtcDsKCgltZ2F3cml0ZTgobWdhLCBTRVFJ RFgsIGluZGV4KTsKCXRtcCA9IG1nYXJlYWQ4KG1nYSwgU0VRREFUQSk7CgltZ2F3cml0ZTgobWdh LCBTRVFJRFgsIGluZGV4KTsKCW1nYXdyaXRlOChtZ2EsIFNFUURBVEEsICh0bXAgJiB+Y2xyKSB8 IHNldCk7CglyZXR1cm4gdG1wOwp9CgpzdGF0aWMgdWNoYXIKY3J0Y2dldChNZ2EqIG1nYSwgaW50 IGluZGV4KQp7CgltZ2F3cml0ZTgobWdhLCBDUlRDSURYLCBpbmRleCk7CglyZXR1cm4gbWdhcmVh ZDgobWdhLCBDUlRDREFUQSk7Cn0KCnN0YXRpYyB1Y2hhcgpjcnRjc2V0KE1nYSogbWdhLCBpbnQg aW5kZXgsIHVjaGFyIHNldCwgdWNoYXIgY2xyKQp7Cgl1Y2hhcgl0bXA7CgoJbWdhd3JpdGU4KG1n YSwgQ1JUQ0lEWCwgaW5kZXgpOwoJdG1wID0gbWdhcmVhZDgobWdhLCBDUlRDREFUQSk7CgltZ2F3 cml0ZTgobWdhLCBDUlRDSURYLCBpbmRleCk7CgltZ2F3cml0ZTgobWdhLCBDUlRDREFUQSwgKHRt cCAmIH5jbHIpIHwgc2V0KTsKCXJldHVybiB0bXA7Cn0KCnN0YXRpYyB1Y2hhcgpjcnRjZXh0Z2V0 KE1nYSogbWdhLCBpbnQgaW5kZXgpCnsKCW1nYXdyaXRlOChtZ2EsIENSVENFWFRJRFgsIGluZGV4 KTsKCXJldHVybiBtZ2FyZWFkOChtZ2EsIENSVENFWFREQVRBKTsKfQoKc3RhdGljIHVjaGFyCmNy dGNleHRzZXQoTWdhKiBtZ2EsIGludCBpbmRleCwgdWNoYXIgc2V0LCB1Y2hhciBjbHIpCnsKCXVj aGFyCXRtcDsKCgltZ2F3cml0ZTgobWdhLCBDUlRDRVhUSURYLCBpbmRleCk7Cgl0bXAgPSBtZ2Fy ZWFkOChtZ2EsIENSVENFWFREQVRBKTsKCW1nYXdyaXRlOChtZ2EsIENSVENFWFRJRFgsIGluZGV4 KTsKCW1nYXdyaXRlOChtZ2EsIENSVENFWFREQVRBLCAodG1wICYgfmNscikgfCBzZXQpOwoJcmV0 dXJuIHRtcDsKfQoKc3RhdGljIHVjaGFyCmRhY2dldChNZ2EqIG1nYSwgaW50IGluZGV4KQp7Cglt Z2F3cml0ZTgobWdhLCBSQU1EQUNJRFgsIGluZGV4KTsKCXJldHVybiBtZ2FyZWFkOChtZ2EsIFJB TURBQ0RBVEEpOwp9CgpzdGF0aWMgdWNoYXIKZGFjc2V0KE1nYSogbWdhLCBpbnQgaW5kZXgsIHVj aGFyIHNldCwgdWNoYXIgY2xyKQp7Cgl1Y2hhcgl0bXA7CgoJbWdhd3JpdGU4KG1nYSwgUkFNREFD SURYLCBpbmRleCk7Cgl0bXAgPSBtZ2FyZWFkOChtZ2EsIFJBTURBQ0RBVEEpOwoJbWdhd3JpdGU4 KG1nYSwgUkFNREFDSURYLCBpbmRleCk7CgltZ2F3cml0ZTgobWdhLCBSQU1EQUNEQVRBLCAodG1w ICYgfmNscikgfCBzZXQpOwoJcmV0dXJuCXRtcDsKfQoKc3RhdGljIHVjaGFyCmdjdGxnZXQoTWdh KiBtZ2EsIGludCBpbmRleCkKewoJbWdhd3JpdGU4KG1nYSwgR0NUTElEWCwgaW5kZXgpOwoJcmV0 dXJuIG1nYXJlYWQ4KG1nYSwgR0NUTERBVEEpOwp9CgpzdGF0aWMgdWNoYXIKZ2N0bHNldChNZ2Eq IG1nYSwgaW50IGluZGV4LCB1Y2hhciBzZXQsIHVjaGFyIGNscikKewoJdWNoYXIJdG1wOwoKCW1n YXdyaXRlOChtZ2EsIEdDVExJRFgsIGluZGV4KTsKCXRtcCA9IG1nYXJlYWQ4KG1nYSwgR0NUTERB VEEpOwoJbWdhd3JpdGU4KG1nYSwgR0NUTElEWCwgaW5kZXgpOwoJbWdhd3JpdGU4KG1nYSwgR0NU TERBVEEsICh0bXAgJiB+Y2xyKSB8IHNldCk7CglyZXR1cm4JdG1wOwp9CgpzdGF0aWMgdWNoYXIK YXR0cmdldChNZ2EqIG1nYSwgaW50IGluZGV4KQp7CgltZ2F3cml0ZTgobWdhLCBBVFRSSURYLCBp bmRleCk7CglyZXR1cm4gbWdhcmVhZDgobWdhLCBBVFRSREFUQSk7Cn0KCnN0YXRpYyB1Y2hhcgph dHRyc2V0KE1nYSogbWdhLCBpbnQgaW5kZXgsIHVjaGFyIHNldCwgdWNoYXIgY2xyKQp7Cgl1Y2hh cgl0bXA7CgoJbWdhd3JpdGU4KG1nYSwgQVRUUklEWCwgaW5kZXgpOwoJdG1wID0gbWdhcmVhZDgo bWdhLCBBVFRSREFUQSk7CgltZ2F3cml0ZTgobWdhLCBBVFRSSURYLCBpbmRleCk7CgltZ2F3cml0 ZTgobWdhLCBBVFRSREFUQSwgKHRtcCAmIH5jbHIpIHwgc2V0KTsKCXJldHVybgl0bXA7Cn0KCnN0 YXRpYyB1Y2hhcgptaXNjZ2V0KE1nYSogbWdhKQp7CglyZXR1cm4gbWdhcmVhZDgobWdhLCBNSVND X1IpOwp9CgpzdGF0aWMgdWNoYXIKbWlzY3NldChNZ2EqIG1nYSwgdWNoYXIgc2V0LCB1Y2hhciBj bHIpCnsKCXVjaGFyCXRtcDsKCgl0bXAgPSBtZ2FyZWFkOChtZ2EsIE1JU0NfUik7CgltZ2F3cml0 ZTgobWdhLCBNSVNDX1csICh0bXAgJiB+Y2xyKSB8IHNldCk7CglyZXR1cm4JdG1wOwp9CgovKiAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiogKi8KCnN0YXRpYyB2b2lkCmR1bXBfYWxsX3JlZ3MoTWdhKiBtZ2EpCnsKCWludAlpOwoKCWZv ciAoaSA9IDA7IGkgPCAyNTsgaSsrKQoJCXRyYWNlKCJjcnRjWyVkXSA9IDB4JXhcbiIsIGksIGNy dGNnZXQobWdhLCBpKSk7Cglmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQoJCXRyYWNlKCJjcnRjZXh0 WyVkXSA9IDB4JXhcbiIsIGksIGNydGNleHRnZXQobWdhLCBpKSk7Cglmb3IgKGkgPSAwOyBpIDwg NTsgaSsrKQoJCXRyYWNlKCJzZXFbJWRdID0gMHgleFxuIiwgaSwgc2VxZ2V0KG1nYSwgaSkpOwoJ Zm9yIChpID0gMDsgaSA8IDk7IGkrKykKCQl0cmFjZSgiZ2N0bFslZF0gPSAweCV4XG4iLCBpLCBn Y3RsZ2V0KG1nYSwgaSkpOwoJdHJhY2UoIm1pc2MgPSAweCV4XG4iLCBtZ2FyZWFkOChtZ2EsIE1J U0NfUikpOwoJZm9yIChpID0gMDsgaSA8IDB4ODc7IGkrKykKCQl0cmFjZSgiZGFjWyVkXSA9IDB4 JXhcbiIsIGksIGRhY2dldChtZ2EsIGkpKTsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCgpzdGF0aWMgdm9pZApkdW1w KFZnYSogdmdhLCBDdGxyKiBjdGxyKQp7CglkdW1wX2FsbF9yZWdzKHZnYS0+cHJpdmF0ZSk7Cglj dGxyLT5mbGFnIHw9IEZkdW1wOwp9CgpzdGF0aWMgdm9pZAptYXBtZ2E0eHgoVmdhKiB2Z2EsIEN0 bHIqIGN0bHIpCnsKCWludCAJCWY7Cglsb25nIAkJbTsKCU1nYSAqCW1nYTsKCglpZih2Z2EtPnBy aXZhdGUgPT0gbmlsKQoJCWVycm9yKCIlczogZzR4eGlvOiBubyAqbWdhNHh4XG4iLCBjdGxyLT5u YW1lKTsKCW1nYSA9IHZnYS0+cHJpdmF0ZTsKCglmID0gb3BlbigiI3YvdmdhY3RsIiwgT1dSSVRF KTsKCWlmKGYgPCAwKQoJCWVycm9yKCIlczogY2FuJ3Qgb3BlbiB2Z2FjdGxcbiIsIGN0bHItPm5h bWUpOwoKCWlmKHdyaXRlKGYsICJ0eXBlIG1nYTR4eCIsIDExKSAhPSAxMSkKCQllcnJvcigiJXM6 IGNhbid0IHNldCBtZ2EgdHlwZVxuIiwgY3Rsci0+bmFtZSk7CgkKCW0gPSBzZWdhdHRhY2goMCwg Im1nYTR4eG1taW8iLCAwLCAxNipLaWxvKTsKCWlmKG0gPT0gLTEpCgkJZXJyb3IoIiVzOiBjYW4n dCBhdHRhY2ggbWdhNHh4bW1pbyBzZWdtZW50XG4iLCBjdGxyLT5uYW1lKTsKCW1nYS0+bW1pbyA9 IG07Cgl0cmFjZSgiJXM6IG1taW8gYXQgMHglbHhcbiIsIGN0bHItPm5hbWUsIG1nYS0+bW1pbyk7 CgoJbSA9IHNlZ2F0dGFjaCgwLCAibWdhNHh4c2NyZWVuIiwgMCwgMzIqTWVnKTsKCWlmKG0gPT0g LTEpCgkJZXJyb3IoIiVzOiBjYW4ndCBhdHRhY2ggbWdhNHh4c2NyZWVuIHNlZ21lbnRcbiIsIGN0 bHItPm5hbWUpOwoJbWdhLT5tbWZiID0gbTsKCXRyYWNlKCIlczogZnJhbWUgYnVmZmVyIGF0IDB4 JWx4XG4iLCBjdGxyLT5uYW1lLCBtZ2EtPm1tZmIpOwoKCS8qIFRPRE8gOiBXaGVuIG5lZWRlZCAu Li4gbWFwIElMT0FEIHRvbyAuLi4gKi8KfQoKc3RhdGljIHZvaWQKc25hcmYoVmdhKiB2Z2EsIEN0 bHIqIGN0bHIpCnsKCWludCAJaSwgaywgbjsKCXVjaGFyICoJcDsKCXVjaGFyCXhbMTZdOwoJUGNp ZGV2ICoJcGNpOwoJTWdhICoJbWdhOwoJdWNoYXIJY3J0Y2V4dDM7CgoJdHJhY2UoIiVzLT5zbmFy ZlxuIiwgY3Rsci0+bmFtZSk7CglpZih2Z2EtPnByaXZhdGUgPT0gbmlsKSB7CgkJcGNpID0gcGNp bWF0Y2gobmlsLCBNQVRST1gsIE1HQTRYWCk7CgkJaWYocGNpID09IG5pbCkKCQkJZXJyb3IoIiVz OiBubyBQY2lkZXYgd2l0aCBWaWQ9MHgxMDJCLCBEaWQ9MHgwNTI1XG4iLCBjdGxyLT5uYW1lKTsK CgkJdHJhY2UoIiVzOiBHNCVkMCByZXYgJWRcbiIsIGN0bHItPm5hbWUsIHBjaS0+cmlkJjB4ODA/ NTowLCBwY2ktPnJpZCYofjB4ODApKTsKCQlpID0gcGNpY2ZncjMyKHBjaSwgUENmZ01nYURldkN0 cmwpOwoJCWlmICgoaSAmIDIpICE9IDIpCgkJCWVycm9yKCIlczogTWVtb3J5IFNwYWNlIG5vdCBl bmFibGVkIC4uLiBBYm9ydGluZyAuLi5cbiIsIGN0bHItPm5hbWUpOwkKCgkJdmdhLT5wcml2YXRl ID0gYWxsb2Moc2l6ZW9mKE1nYSkpOwoJCW1nYSA9IChNZ2EqKXZnYS0+cHJpdmF0ZTsKCQltZ2Et PmRldmlkID0gCXBjaS0+ZGlkOwoJCW1nYS0+cmV2aWQgPQlwY2ktPnJpZDsJCgkJbWdhLT5wY2kg PSAJcGNpOwoKCQltYXBtZ2E0eHgodmdhLCBjdGxyKTsKCX0KCWVsc2UgewoJCW1nYSA9IChNZ2Eq KXZnYS0+cHJpdmF0ZTsKCX0KCgkvKiBGaW5kIG91dCBob3cgbXVjaCBtZW1vcnkgaXMgaGVyZSwg c29tZSBtdWx0aXBsZSBvZiAyTWVnICovCgoJLyogRmlyc3QgU2V0IE1HQSBNb2RlIC4uLiAqLwoJ Y3J0Y2V4dDMgPSBjcnRjZXh0c2V0KG1nYSwgMywgMHg4MCwgMHhmZik7CgoJcCA9ICh1Y2hhciop bWdhLT5tbWZiOwoJbiA9IDE2OwoJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewoJCWsgPSAoMipp KzEpKk1lZzsKCQlwW2tdID0gMDsKCQlwW2tdID0gaSsxOwoJCSooKHVjaGFyKikobWdhLT5tbWlv ICsgQ0FDSEVGTFVTSCkpID0gMDsKCQl4W2ldID0gcFtrXTsKCQl0cmFjZSgieFslZF09JWRcbiIs IGksIHhbaV0pOwoJfQoJZm9yKGkgPSAxOyBpIDwgbjsgaSsrKQoJCWlmKHhbaV0gIT0gaSsxKQoJ CQlicmVhazsKCXZnYS0+dm16ID0gbWdhLT5mYnNpemUgPSAyKmkqTWVnOwoJdHJhY2UoInByb2Jl IGZvdW5kICVkIG1lZ2FieXRlc1xuIiwgMippKTsKCgljcnRjZXh0c2V0KG1nYSwgMywgY3J0Y2V4 dDMsIDB4ZmYpOwoKCWN0bHItPmZsYWcgfD0gRnNuYXJmOwp9CgpzdGF0aWMgdm9pZApvcHRpb25z KFZnYSogdmdhLCBDdGxyKiBjdGxyKQp7CglNb2RlICptb2RlOwoKCW1vZGUgPSB2Z2EtPm1vZGU7 CglpZihtb2RlLT54ICUgMTI4KXsKCQltb2RlLT54ID0gKG1vZGUtPngvMTI4KSoxMjg7CgkJc3By aW50KG1vZGUtPnNpemUsICIlZHglZHglZCIsIG1vZGUtPngsIG1vZGUtPnksIG1vZGUtPnopOwoJ fQoJY3Rsci0+ZmxhZyB8PSBGb3B0aW9uczsKfQoKLyoKCWNhbGNjbG9jayAtIENhbGN1bGF0ZSB0 aGUgUExMIHNldHRpbmdzIChtLCBuLCBwLCBzKS4KKi8Kc3RhdGljIGRvdWJsZQpjYWxjY2xvY2so TWdhKiBtZ2EsIGxvbmcgRm5lZWRlZCkKewoJZG91YmxlCQlGcGxsOwoJZG91YmxlCQlGdmNvOwoJ ZG91YmxlIAkJRnJlZjsKCWludAkJcGl4cGxsX21fbWluOwoJaW50CQlwaXhwbGxfbV9tYXg7Cglp bnQJCXBpeHBsbF9uX21pbjsKCWludAkJcGl4cGxsX25fbWF4OwoJaW50CQlwaXhwbGxfcF9tYXg7 CglpbnQJCXBsbF9taW47CglpbnQJCXBsbF9tYXg7Cglkb3VibGUgCQlGZXJyLCBGY2FsYzsKCWlu dAkJbSwgbiwgcDsKCQkKCS8qIFRoZXNlIHZhbHVlcyBhcmUgdGFrZW4gZnJvbSBNYXRyb3ggRzQw MCBTcGVjaWZpY2F0aW9uIC0gcCA0LTkxICovCglGcmVmICAgICAJPSAyNzAwMDAwMC4wOwoJcGl4 cGxsX25fbWluIAk9IDc7CglwaXhwbGxfbl9tYXggCT0gMTI3OwoJcGl4cGxsX21fbWluCT0gMTsK CXBpeHBsbF9tX21heAk9IDMxOwoJcGl4cGxsX3BfbWF4IAk9IDc7CglwbGxfbWluCQk9IDUwMDAw OwoJcGxsX21heAkJPSBtZ2EtPm1heHBjbGs7CgoJaWYgKEZuZWVkZWQgPCBwbGxfbWluKQoJCWVy cm9yKCJtZ2E6IFRvbyBsaXR0bGUgRnJlcXVlbmN5ICVsZCA6IE1pbmltdW0gc3VwcG9ydGVkIGJ5 IFBMTCBpcyAlZCIsIAoJCQlGbmVlZGVkLCBwbGxfbWluKTsKCglpZiAoRm5lZWRlZCA+IHBsbF9t YXgpCgkJZXJyb3IoIm1nYTogVG9vIGJpZyBGcmVxdWVuY3kgJWxkIDogTWF4aW11bSBzdXBwb3J0 ZWQgYnkgUExMIGlzICVkIiwKCQkJRm5lZWRlZCwgcGxsX21heCk7CgoJRnZjbyA9ICggZG91Ymxl ICkgRm5lZWRlZDsKCWZvciAocCA9IDA7ICBwIDw9IHBpeHBsbF9wX21heCAmJiBGdmNvIDwgcGxs X21heDsgcCA9IHAgKiAyICsgMSwgRnZjbyAqPSAyLjApCgkJOwoJbWdhLT5waXhwbGxfcCA9IHA7 CgoJRmVyciA9IEZuZWVkZWQ7Cglmb3IgKCBtID0gcGl4cGxsX21fbWluIDsgbSA8PSBwaXhwbGxf bV9tYXggOyBtKysgKQoJCWZvciAoIG4gPSBwaXhwbGxfbl9taW47IG4gPD0gcGl4cGxsX25fbWF4 OyBuKysgKQoJCXsgCgkJCUZjYWxjID0gRnJlZiAqIChuICsgMSkgLyAobSArIDEpIDsKCgkJCS8q CgkJCSAqIFBpY2sgdGhlIGNsb3Nlc3QgZnJlcXVlbmN5LgoJCQkgKi8KCQkJaWYgKCBhYnMoRmNh bGMgLSBGdmNvKSA8IEZlcnIgKSB7CgkJCQlGZXJyID0gYWJzKEZjYWxjIC0gRnZjbyk7CgkJCQlt Z2EtPnBpeHBsbF9tID0gbTsKCQkJCW1nYS0+cGl4cGxsX24gPSBuOwoJCQl9CgkJfQoJCglGdmNv ID0gRnJlZiAqIChtZ2EtPnBpeHBsbF9uICsgMSkgLyAobWdhLT5waXhwbGxfbSArIDEpOwoKCWlm ICggKDUwMDAwMDAwLjAgPD0gRnZjbykgJiYgKEZ2Y28gPCAxMTAwMDAwMDAuMCkgKQoJCW1nYS0+ cGl4cGxsX3AgfD0gMDsJCglpZiAoICgxMTAwMDAwMDAuMCA8PSBGdmNvKSAmJiAoRnZjbyA8IDE3 MDAwMDAwMC4wKSApCgkJbWdhLT5waXhwbGxfcCB8PSAoMTw8Myk7CQoJaWYgKCAoMTcwMDAwMDAw LjAgPD0gRnZjbykgJiYgKEZ2Y28gPCAyNDAwMDAwMDAuMCkgKQoJCW1nYS0+cGl4cGxsX3AgfD0g KDI8PDMpOwkKCWlmICggKDI0MDAwMDAwMC4wIDw9IEZ2Y28pICkKCQltZ2EtPnBpeHBsbF9wIHw9 ICgzPDwzKTsJCgoJRnBsbCA9IEZ2Y28gLyAocCArIDEpOwoKCXJldHVybiBGcGxsOwp9CgpzdGF0 aWMgdm9pZAppbml0KFZnYSogdmdhLCBDdGxyKiBjdGxyKQp7CglNb2RlKgltb2RlOwoJTWdhKglt Z2E7Cglkb3VibGUJRnBsbDsKCUN0bHIqCWM7CglpbnQJaTsKCXVsb25nCXQ7CgoJbWdhID0gdmdh LT5wcml2YXRlOwoJbW9kZSA9IHZnYS0+bW9kZTsKCgl0cmFjZSgibWdhIG1taW8gYXQgJWx4XG4i LCBtZ2EtPm1taW8pOwoKCWN0bHItPmZsYWcgfD0gVWxpbmVhcjsKCglpZiAoKG1vZGUtPnogIT0g MzIpICYmIChtb2RlLT56ICE9IDgpKQoJCWVycm9yKCJkZXB0aCAlZCBub3Qgc3VwcG9ydGVkICFc biIsIG1vZGUtPnopOwoKCWlmIChtb2RlLT5pbnRlcmxhY2UpCgkJZXJyb3IoImludGVybGFjZWQg bW9kZSBub3Qgc3VwcG9ydGVkICFcbiIpOwoKCXRyYWNlKCIlczogSW5pdGlhbGl6aW5nIG1vZGUg JWR4JWR4JWQgb24gJXNcbiIsIGN0bHItPm5hbWUsIG1vZGUtPngsIG1vZGUtPnksIG1vZGUtPnos IG1vZGUtPnR5cGUpOwoJdHJhY2UoIiVzOiBTdWdnZXN0ZWQgRG90IENsb2NrIDogJWRcbiIsIAlj dGxyLT5uYW1lLCBtb2RlLT5mcmVxdWVuY3kpOwoJdHJhY2UoIiVzOiBIb3Jpem9udGFsIFRvdGFs ID0gJWRcbiIsIAkJY3Rsci0+bmFtZSwgbW9kZS0+aHQpOwoJdHJhY2UoIiVzOiBTdGFydCBIb3Jp em9udGFsIEJsYW5rID0gJWRcbiIsIAljdGxyLT5uYW1lLCBtb2RlLT5zaGIpOwoJdHJhY2UoIiVz OiBFbmQgSG9yaXpvbnRhbCBCbGFuayA9ICVkXG4iLCAJY3Rsci0+bmFtZSwgbW9kZS0+ZWhiKTsK CXRyYWNlKCIlczogVmVydGljYWwgVG90YWwgPSAlZFxuIiwgCQljdGxyLT5uYW1lLCBtb2RlLT52 dCk7Cgl0cmFjZSgiJXM6IFZlcnRpY2FsIFJldHJhY2UgU3RhcnQgPSAlZFxuIiwgCWN0bHItPm5h bWUsIG1vZGUtPnZycyk7Cgl0cmFjZSgiJXM6IFZlcnRpY2FsIFJldHJhY2UgRW5kID0gJWRcbiIs IAljdGxyLT5uYW1lLCBtb2RlLT52cmUpOwoJdHJhY2UoIiVzOiBTdGFydCBIb3Jpem9udGFsIFN5 bmMgPSAlZFxuIiwgCWN0bHItPm5hbWUsIG1vZGUtPnNocyk7Cgl0cmFjZSgiJXM6IEVuZCBIb3Jp em9udGFsIFN5bmMgPSAlZFxuIiwgCWN0bHItPm5hbWUsIG1vZGUtPmVocyk7Cgl0cmFjZSgiJXM6 IEhTeW5jID0gJWNcbiIsIAkJCWN0bHItPm5hbWUsIG1vZGUtPmhzeW5jKTsKCXRyYWNlKCIlczog VlN5bmMgPSAlY1xuIiwgCQkJY3Rsci0+bmFtZSwgbW9kZS0+dnN5bmMpOwoJdHJhY2UoIiVzOiBJ bnRlcmxhY2UgPSAlZFxuIiwgCQkJY3Rsci0+bmFtZSwgbW9kZS0+aW50ZXJsYWNlKTsKCgltZ2Et Pm1heHBjbGsJPSAzMDAwMDAwMDA7CgoJRnBsbCA9IGNhbGNjbG9jayhtZ2EsIG1vZGUtPmZyZXF1 ZW5jeSk7Cgl0cmFjZSgiRnBsbCBzZXQgdG8gJWZcbiIsIEZwbGwpOwoJdHJhY2UoInBpeGNsa3Mg OiBuID0gJWQgbSA9ICVkIHAgPSAlZFxuIiwgbWdhLT5waXhwbGxfbiwgbWdhLT5waXhwbGxfbSwg bWdhLT5waXhwbGxfcCAmIDB4Nyk7CgoJdHJhY2UoIlBDSSBPcHRpb24xID0gMHgleFxuIiwgcGNp Y2ZncjMyKG1nYS0+cGNpLCBQQ2ZnTWdhT3B0aW9uMSkpOwoJdHJhY2UoIlBDSSBPcHRpb24yID0g MHgleFxuIiwgcGNpY2ZncjMyKG1nYS0+cGNpLCBQQ2ZnTWdhT3B0aW9uMikpOwoJdHJhY2UoIlBD SSBPcHRpb24zID0gMHgleFxuIiwgcGNpY2ZncjMyKG1nYS0+cGNpLCBQQ2ZnTWdhT3B0aW9uMykp OwoKCW1nYS0+aHRvdGFsID0JCShtb2RlLT5odCA+PiAzKSAtIDU7CgltZ2EtPmhkaXNwZW5kID0J CShtb2RlLT54ID4+IDMpIC0gMTsKCWlmICgxKQoJewoJCW1nYS0+aGJsa3N0ciA9CQltZ2EtPmhk aXNwZW5kOyAJCS8qIChtb2RlLT5zaGIgPj4gMyk7ICovCgkJbWdhLT5oYmxrZW5kID0JCW1nYS0+ aHRvdGFsICsgNDsJLyogKG1vZGUtPmVoYiA+PiAzKTsgKi8KCX0gZWxzZQoJewoJCW1nYS0+aGJs a3N0ciA9CQkobW9kZS0+c2hiID4+IDMpOwoJCW1nYS0+aGJsa2VuZCA9CQkobW9kZS0+ZWhiID4+ IDMpOyAKCX0KCW1nYS0+aHN5bmNzdHIgPQkJKG1vZGUtPnNocyA+PiAzKTsKCW1nYS0+aHN5bmNl bmQgPQkJKG1vZGUtPmVocyA+PiAzKTsKCW1nYS0+aHN5bmNkZWwgPSAJMDsKCW1nYS0+dnRvdGFs ID0JCW1vZGUtPnZ0IC0gMjsKCW1nYS0+dmRpc3BlbmQgPSAJbW9kZS0+eSAtIDE7CgltZ2EtPnZi bGtzdHIgPSAJCW1vZGUtPnkgLSAxOwoJbWdhLT52YmxrZW5kID0gCQltb2RlLT52dCAtIDE7Cglt Z2EtPnZzeW5jc3RyID0gCW1vZGUtPnZyczsKCW1nYS0+dnN5bmNlbmQgPSAJbW9kZS0+dnJlOwoJ bWdhLT5saW5lY29tcCA9CQltb2RlLT55OwoJbWdhLT5oc3luY3NlbCA9IAkwOwkvKiBEbyBub3Qg ZG91YmxlIGxpbmVzIC4uLiAqLwoJbWdhLT5zdGFydGFkZCA9CQkwOwoJbWdhLT5vZmZzZXQgPQkJ KG1vZGUtPnggKiBtb2RlLT56KSAvIDEyODsKCS8qIE5vIFpvb20gKi8KCW1nYS0+bWF4c2NhbiA9 IAkJMDsKCS8qIE5vdCB1c2VkIGluIFBvd2VyIEdyYXBoaWMgbW9kZSAqLwoJbWdhLT5jdXJsb2Mg PQkJMDsKCW1nYS0+cHJvd3NjYW4gPSAJMDsKCW1nYS0+Y3Vycm93c3RyID0gCTA7CgltZ2EtPmN1 cnJvd2VuZCA9IAkwOwoJbWdhLT5jdXJvZmYgPSAJCTE7CgltZ2EtPnVuZHJvdyA9IAkJMDsKCW1n YS0+Y3Vyc2tldyA9IAkJMDsKCW1nYS0+Y29udjJ0NCA9IAkJMDsKCW1nYS0+aW50ZXJsYWNlID0J MDsKCW1nYS0+aGRpc3Bza2V3ID0JMDsKCW1nYS0+Ynl0ZXBhbiA9IAkJMDsKCW1nYS0+ZG90Y2xr cnQgPSAJMDsKCW1nYS0+ZHdvcmQgPQkJMDsKCW1nYS0+d2Jtb2RlID0JCTE7CgltZ2EtPmFkZHdy YXAgPSAJCTA7CS8qIE5vdCBVc2VkICEgKi8KCW1nYS0+c2Vscm93c2NhbiA9CTE7CgltZ2EtPmNt cyA9CQkxOwoJbWdhLT5jc3luY2NlbiA9CQkwOyAJLyogRGlzYWJsZSBjb21wb3NpdGUgc3luYyAq LwoKCS8qIFZJRFJTVCBQaW4gKi8KCW1nYS0+aHJzdGVuID0JCTE7CgltZ2EtPnZyc3RlbiA9CQkx OwoKCS8qIHZlcnRpY2FsIGludGVycnVwdCBjb250cm9sICovCgltZ2EtPnZpbnRlbiA9IAkJMTsK CW1nYS0+dmludGNsciA9IAkJMTsKCgkvKiBMZXQgW2h2XXN5bmMgcnVuIGZyZWVseSAqLwoJbWdh LT5oc3luY29mZiA9CQkwOwoJbWdhLT52c3luY29mZiA9CQkwOwoKCW1nYS0+Y3J0Y3JzdE4gPQkJ MTsKCgltZ2EtPm1nYW1vZGUgPSAJCTE7CgltZ2EtPnNjYWxlID0JCShtb2RlLT56ID09IDgpID8g MCA6IDM7CS8qIDggb3IgMzIgYml0cyBtb2RlICovCgkKCW1nYS0+Y3J0Y3Byb3RlY3QgPQkxOwoJ bWdhLT53aW5zaXplID0gCQkwOwoJbWdhLT53aW5mcmVxID0gCQkwOwoKCWlmICgobWdhLT5odG90 YWwgPT0gMCkKCSAgICB8fCAobWdhLT5oYmxrZW5kIDw9IChtZ2EtPmhibGtzdHIgKyAxKSkKCSAg ICB8fCAoKG1nYS0+aHRvdGFsIC0gbWdhLT5oZGlzcGVuZCkgPT0gMCkKCSAgICB8fCAoKG1nYS0+ aHRvdGFsIC0gbWdhLT5ieXRlcGFuICsgMikgPD0gbWdhLT5oZGlzcGVuZCkKCSAgICB8fCAobWdh LT5oc3luY3N0ciA8PSAobWdhLT5oZGlzcGVuZCArIDIpKQoJICAgIHx8IChtZ2EtPnZ0b3RhbCA9 PSAwKSkKCXsKCQllcnJvcigiSW52YWxpZCBQb3dlciBHcmFwaGljIE1vZGUgOlxuIgoJCSAgICAg ICJtZ2EtPmh0b3RhbCA9ICVsZFxuIgoJCSAgICAgICJtZ2EtPmhkaXNwZW5kID0gJWxkXG4iCgkJ ICAgICAgIm1nYS0+aGJsa3N0ciA9ICVsZFxuIgoJCSAgICAgICJtZ2EtPmhibGtlbmQgPSAlbGRc biIKCQkgICAgICAibWdhLT5oc3luY3N0ciA9ICVsZFxuIgoJCSAgICAgICJtZ2EtPmhzeW5jZW5k ID0gJWxkXG4iCgkJICAgICAgIm1nYS0+aHN5bmNkZWwgPSAlbGRcbiIKCQkgICAgICAibWdhLT52 dG90YWwgPSAlbGRcbiIKCQkgICAgICAibWdhLT52ZGlzcGVuZCA9ICVsZFxuIgoJCSAgICAgICJt Z2EtPnZibGtzdHIgPSAlbGRcbiIKCQkgICAgICAibWdhLT52YmxrZW5kID0gJWxkXG4iCgkJICAg ICAgIm1nYS0+dnN5bmNzdHIgPSAlbGRcbiIKCQkgICAgICAibWdhLT52c3luY2VuZCA9ICVsZFxu IgoJCSAgICAgICJtZ2EtPmxpbmVjb21wID0gJWxkXG4iLAoJCSAgICAgIG1nYS0+aHRvdGFsLAoJ CSAgICAgIG1nYS0+aGRpc3BlbmQsCgkJICAgICAgbWdhLT5oYmxrc3RyLAoJCSAgICAgIG1nYS0+ aGJsa2VuZCwKCQkgICAgICBtZ2EtPmhzeW5jc3RyLAoJCSAgICAgIG1nYS0+aHN5bmNlbmQsCgkJ ICAgICAgbWdhLT5oc3luY2RlbCwKCQkgICAgICBtZ2EtPnZ0b3RhbCwKCQkgICAgICBtZ2EtPnZk aXNwZW5kLAoJCSAgICAgIG1nYS0+dmJsa3N0ciwKCQkgICAgICBtZ2EtPnZibGtlbmQsCgkJICAg ICAgbWdhLT52c3luY3N0ciwKCQkgICAgICBtZ2EtPnZzeW5jZW5kLAoJCSAgICAgIG1nYS0+bGlu ZWNvbXAKCQkgICAgICApOwoJfQoKCW1nYS0+aGlwcmlsdmwgPSAwOwoJbWdhLT5tYXhoaXByaSA9 IDA7CgltZ2EtPmMyaGlwcmlsdmwgPSAwOwoJbWdhLT5jMm1heGhpcHJpID0gMDsKCgltZ2EtPm1p c2MgPSAoKG1vZGUtPmhzeW5jICE9ICctJyk/MDooMTw8NikpIHwgKChtb2RlLT52c3luYyAhPSAn LScpPzA6KDE8PDcpKTsKCgltZ2EtPmNydGNbMHgwMF0gPSAweGZmICYgbWdhLT5odG90YWw7Cglt Z2EtPmNydGNbMHgwMV0gPSAweGZmICYgbWdhLT5oZGlzcGVuZDsKCW1nYS0+Y3J0Y1sweDAyXSA9 IDB4ZmYgJiBtZ2EtPmhibGtzdHI7CgltZ2EtPmNydGNbMHgwM10gPSAoMHgxZiAmIG1nYS0+aGJs a2VuZCkgCgkJfCAoKDB4MDMgJiBtZ2EtPmhkaXNwc2tldykgPDwgNSkKCQl8IDB4ODAJLyogY2Yg My0zMDQgKi8KCQk7CgltZ2EtPmNydGNbMHgwNF0gPSAweGZmICYgbWdhLT5oc3luY3N0cjsKCW1n YS0+Y3J0Y1sweDA1XSA9ICgweDFmICYgbWdhLT5oc3luY2VuZCkgCgkJfCAoKDB4MDMgJiBtZ2Et PmhzeW5jZGVsKSA8PCA1KSAKCQl8ICgoMHgwMSAmIChtZ2EtPmhibGtlbmQgPj4gNSkpIDw8IDcp CgkJOwoJbWdhLT5jcnRjWzB4MDZdID0gMHhmZiAmIG1nYS0+dnRvdGFsOwoJdCA9ICgoMHgwMSAm IChtZ2EtPnZ0b3RhbCA+PiA4KSkgPDwgMCkKCSAgfCAoKDB4MDEgJiAobWdhLT52ZGlzcGVuZCA+ PiA4KSkgPDwgMSkKCSAgfCAoKDB4MDEgJiAobWdhLT52c3luY3N0ciA+PiA4KSkgPDwgMikKCSAg fCAoKDB4MDEgJiAobWdhLT52Ymxrc3RyID4+IDgpKSA8PCAzKQoJICB8ICgoMHgwMSAmIChtZ2Et PmxpbmVjb21wID4+IDgpKSA8PCA0KQoJICB8ICgoMHgwMSAmIChtZ2EtPnZ0b3RhbCA+PiA5KSkg PDwgNSkKCSAgfCAoKDB4MDEgJiAobWdhLT52ZGlzcGVuZCA+PiA5KSkgPDwgNikKCSAgfCAoKDB4 MDEgJiAobWdhLT52c3luY3N0ciA+PiA5KSkgPDwgNykKCSAgOwoJbWdhLT5jcnRjWzB4MDddID0g MHhmZiAmIHQ7Cgl0cmFjZSgiKioqKioqKioqKioqKiIpOwoJdHJhY2UoImNydGMgMHgwNyA9ICVs eFxuIiwgdCk7Cgl0cmFjZSgibWdhLT52dG90YWwgPSAlbHhcbiIsIG1nYS0+dnRvdGFsKTsKCXRy YWNlKCJtZ2EtPnZkaXNwZW5kID0gJWx4XG4iLCBtZ2EtPnZkaXNwZW5kKTsKCXRyYWNlKCJtZ2Et PnZzeW5jc3RyID0gJWx4XG4iLCBtZ2EtPnZzeW5jc3RyKTsKCXRyYWNlKCJtZ2EtPnZibGtzdHIg PSAlbHhcbiIsIG1nYS0+dmJsa3N0cik7Cgl0cmFjZSgibWdhLT5saW5lY29tcCA9ICVseFxuIiwg bWdhLT5saW5lY29tcCk7Cgl0cmFjZSgiKioqKioqKioqKioqKiIpOwoKCW1nYS0+Y3J0Y1sweDA4 XSA9ICgweDFmICYgbWdhLT5wcm93c2NhbikgCgkJfCAoKDB4MDMgJiBtZ2EtPmJ5dGVwYW4pIDw8 IDUpOwoJbWdhLT5jcnRjWzB4MDldID0gKDB4MWYgJiBtZ2EtPm1heHNjYW4pIAoJCXwgKCgweDAx ICYgKG1nYS0+dmJsa3N0ciA+PiA5KSkgPDwgNSkKCQl8ICgoMHgwMSAmIChtZ2EtPmxpbmVjb21w ID4+IDkpKSA8PCA2KQoJCXwgKCgweDAxICYgbWdhLT5jb252MnQ0KSA8PCA3KQoJCTsKCW1nYS0+ Y3J0Y1sweDBhXSA9ICgweDFmICYgbWdhLT5jdXJyb3dzdHIpCgkJfCAoKDB4MDEgJiBtZ2EtPmN1 cm9mZikgPDwgNSkKCQk7CgltZ2EtPmNydGNbMHgwYl0gPSAoMHgxZiAmIG1nYS0+Y3Vycm93ZW5k KQoJCXwgKCgweDAzICYgbWdhLT5jdXJza2V3KSA8PCA1KQoJCTsKCW1nYS0+Y3J0Y1sweDBjXSA9 IDB4ZmYgJiAobWdhLT5zdGFydGFkZCA+PiA4KTsKCW1nYS0+Y3J0Y1sweDBkXSA9IDB4ZmYgJiBt Z2EtPnN0YXJ0YWRkOwoJbWdhLT5jcnRjWzB4MGVdID0gMHhmZiAmIChtZ2EtPmN1cmxvYyA+PiA4 KTsKCW1nYS0+Y3J0Y1sweDBmXSA9IDB4ZmYgJiBtZ2EtPmN1cmxvYzsKCW1nYS0+Y3J0Y1sweDEw XSA9IDB4ZmYgJiBtZ2EtPnZzeW5jc3RyOwoJbWdhLT5jcnRjWzB4MTFdID0gKDB4MGYgJiBtZ2Et PnZzeW5jZW5kKQoJCXwgKCgweDAxICYgbWdhLT52aW50Y2xyKSA8PCA0KQoJCXwgKCgweDAxICYg bWdhLT52aW50ZW4pIDw8IDUpCgkJfCAoKDB4MDEgJiBtZ2EtPmNydGNwcm90ZWN0KSA8PCA3KQoJ CTsKCW1nYS0+Y3J0Y1sweDEyXSA9IDB4ZmYgJiBtZ2EtPnZkaXNwZW5kOwoJbWdhLT5jcnRjWzB4 MTNdID0gMHhmZiAmIG1nYS0+b2Zmc2V0OwoJbWdhLT5jcnRjWzB4MTRdID0gMHgxZiAmIG1nYS0+ dW5kcm93OwkvKiB2Z2Egb25seSAqLwoJbWdhLT5jcnRjWzB4MTVdID0gMHhmZiAmIG1nYS0+dmJs a3N0cjsKCW1nYS0+Y3J0Y1sweDE2XSA9IDB4ZmYgJiBtZ2EtPnZibGtlbmQ7CgltZ2EtPmNydGNb MHgxN10gPSAoKDB4MDEgJiBtZ2EtPmNtcykgPDwgMCkKCQl8ICgoMHgwMSAmIG1nYS0+c2Vscm93 c2NhbikgPDwgMSkKCQl8ICgoMHgwMSAmIG1nYS0+aHN5bmNzZWwpIDw8IDIpCgkJfCAoKDB4MDEg JiBtZ2EtPmFkZHdyYXApIDw8IDUpCgkJfCAoKDB4MDEgJiBtZ2EtPndibW9kZSkgPDwgNikKCQl8 ICgoMHgwMSAmIG1nYS0+Y3J0Y3JzdE4pIDw8IDcpCgkJOwoJbWdhLT5jcnRjWzB4MThdID0gbWdh LT5saW5lY29tcDsKCQoJbWdhLT5jcnRjZXh0WzBdID0gKDB4MGYgJiAobWdhLT5zdGFydGFkZCA+ PiAxNikpCgkJfCAoKDB4MDMgJiAobWdhLT5vZmZzZXQgPj4gOCkpIDw8IDQpCgkJfCAoKDB4MDEg JiAobWdhLT5zdGFydGFkZCA+PiAyMCkpIDw8IDYpCgkJfCAoKDB4MDEgJiBtZ2EtPmludGVybGFj ZSkgPDwgNykKCQk7CgltZ2EtPmNydGNleHRbMV0gPSAoKDB4MDEgJiAobWdhLT5odG90YWwgPj4g OCkpIDw8IDApCgkJfCAoKDB4MDEgJiAobWdhLT5oYmxrc3RyID4+IDgpKSA8PCAxKQoJCXwgKCgw eDAxICYgKG1nYS0+aHN5bmNzdHIgPj4gOCkpIDw8IDIpCgkJfCAoKDB4MDEgJiBtZ2EtPmhyc3Rl bikgPDwgMykKCQl8ICgoMHgwMSAmIG1nYS0+aHN5bmNvZmYpIDw8IDQpCgkJfCAoKDB4MDEgJiBt Z2EtPnZzeW5jb2ZmKSA8PCA1KQoJCXwgKCgweDAxICYgKG1nYS0+aGJsa2VuZCA+PiA2KSkgPDwg NikKCQl8ICgoMHgwMSAmIG1nYS0+dnJzdGVuKSA8PCA3KQoJCTsKCW1nYS0+Y3J0Y2V4dFsyXSA9 ICgoMHgwMyAmIChtZ2EtPnZ0b3RhbCA+PiAxMCkpIDw8IDApCgkJfCAoKDB4MDEgJiAobWdhLT52 ZGlzcGVuZCA+PiAxMCkpIDw8IDIpCgkJfCAoKDB4MDMgJiAobWdhLT52Ymxrc3RyID4+IDEwKSkg PDwgMykKCQl8ICgoMHgwMyAmIChtZ2EtPnZzeW5jc3RyID4+IDEwKSkgPDwgNSkKCQl8ICgoMHgw MSAmIChtZ2EtPmxpbmVjb21wID4+IDEwKSkgPDwgNykKCQk7CgltZ2EtPmNydGNleHRbM10gPSAo KDB4MDcgJiBtZ2EtPnNjYWxlKSA8PCAwKQoJCXwgKCgweDAxICYgbWdhLT5jc3luY2NlbikgPDwg NikKCQl8ICgoMHgwMSAmIG1nYS0+bWdhbW9kZSkgPDwgNykKCQk7CgltZ2EtPmNydGNleHRbNF0g PSAwOwkvKiBtZW1vcnkgcGFnZSAuLi4gbm90IHVzZWQgaW4gUG93ZXIgR3JhcGhpYyBNb2RlICov CgltZ2EtPmNydGNleHRbNV0gPSAwOwkvKiBOb3QgdXNlZCBpbiBpbnRlcmxhY2VkIG1vZGUgKi8K CW1nYS0+Y3J0Y2V4dFs2XSA9ICgoMHgwNyAmIG1nYS0+aGlwcmlsdmwpIDw8IDApCgkJfCAoKDB4 MDcgJiBtZ2EtPm1heGhpcHJpKSA8PCA0KQoJCTsKCW1nYS0+Y3J0Y2V4dFs3XSA9ICgoMHgwNyAm IG1nYS0+d2luc2l6ZSkgPDwgMSkKCQl8ICgoMHgwNyAmIG1nYS0+d2luZnJlcSkgPDwgNSkKCQk7 CgltZ2EtPmNydGNleHRbOF0gPSAoMHgwMSAmIChtZ2EtPnN0YXJ0YWRkID4+IDIxKSkgPDwgMDsK CgkvKiBJbml0aWFsaXplIFNlcXVlbmNlciAqLwoJbWdhLT5zZXF1ZW5jZXJbMF0gPSAwOwoJbWdh LT5zZXF1ZW5jZXJbMV0gPSAwOwoJbWdhLT5zZXF1ZW5jZXJbMl0gPSAweDAzOwoJbWdhLT5zZXF1 ZW5jZXJbM10gPSAwOwoJbWdhLT5zZXF1ZW5jZXJbNF0gPSAweDAyOwoKCS8qIEdyYXBoaWMgQ29u dHJvbCByZWdpc3RlcnMgYXJlIGlnbm9yZWQgd2hlbiBub3QgdXNpbmcgMHhBMDAwMCBhcGVydHVy ZSAqLwkKCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCgkJbWdhLT5ncmFwaGljc1tpXSA9IDA7CQoK CS8qIFRoZSBBdHRyaWJ1dGUgQ29udHJvbGVyIGlzIG5vdCBhdmFpbGFibGUgaW4gUG93ZXIgR3Jh cGhpY3MgbW9kZSAqLwoJZm9yIChpID0gMDsgaSA8IDB4MTU7IGkrKykKCQltZ2EtPmF0dHJpYnV0 ZVtpXSA9IGk7CQoKCS8qIGRpc2FibGUgdmdhIGxvYWQgKHdhbnQgdG8gZG8gZmllbGRzIGluIGRp ZmZlcmVudCBvcmRlcikgKi8KCWZvcihjID0gdmdhLT5saW5rOyBjOyBjID0gYy0+bGluaykKCQlp ZiAoc3RybmNtcChjLT5uYW1lLCAidmdhIiwgMykgPT0gMCkKCQkJYy0+bG9hZCA9IG5pbDsKfQoK ZW51bQp7CglTZXFfQ2xvY2tpbmdNb2RlID0JMSwKCQlEb3Rtb2RlID0JKDE8PDApLAoJCVNoZnRs ZHJ0ID0JKDE8PDIpLAoJCURvdGNsa3J0ID0JKDE8PDMpLAoJCVNoaWZ0Zm91ciA9CSgxPDw0KSwK CQlTY3JvZmYgPQkoMTw8NSksCgoJQ3J0Y0V4dF9Ib3Jpem9udGNvdW50ID0JMSwKCQlIdG90YWwg PQkoMTw8MCksCgkJSGJsa3N0ciA9CSgxPDwxKSwKCQlIc3luY3N0ciA9CSgxPDwyKSwKCQlIcnN0 ZW4gPQkoMTw8MyksCgkJSHN5bmNvZmYgPQkoMTw8NCksCgkJVnN5bmNvZmYgPQkoMTw8NSksCgkJ SGJsa2VuZCA9CSgxPDw2KSwKCQlWcnN0ZW4gPQkoMTw8NyksCgoJQ3J0Y0V4dF9NaXNjZWxsYW5l b3VzID0JMywKCQlNZ2Ftb2RlID0JKDE8PDcpLAoKCURhY19YcGl4Y2xrY3RybCA9CTB4MWEsCgkJ UGl4Y2xrc2wgPSAJCSgzPDwwKSwKCQlQaXhjbGtkaXMgPQkoMTw8MiksCgkJUGl4cGxscGRuID0J KDE8PDMpLAoKCURhY19YcGl4cGxsc3RhdCA9CTB4NGYsCgkJUGl4bG9jayA9IAkJKDE8PDYpLAoJ CglEYWNfWHBpeHBsbGFuID0JCTB4NDUsCglEYWNfWHBpeHBsbGJuID0JCTB4NDksCglEYWNfWHBp eHBsbGNuID0JCTB4NGQsCgoJRGFjX1hwaXhwbGxhbSA9CQkweDQ0LCAKCURhY19YcGl4cGxsYm0g PQkJMHg0OCwKCURhY19YcGl4cGxsY20gPQkJMHg0YywKCglEYWNfWHBpeHBsbGFwID0JCTB4NDYs CglEYWNfWHBpeHBsbGJwID0JCTB4NGEsCglEYWNfWHBpeHBsbGNwID0JCTB4NGUsCgoJRGFjX1ht dWxjdHJsID0JCTB4MTksCgkJQ29sb3JEZXB0aCA9CSg3PDwwKSwKCQkJXzhiaXRzUGVyUGl4ZWwg PSAJMCwKCQkJXzE1Yml0c1BlclBpeGVsID0JMSwKCQkJXzE2Yml0c1BlclBpeGVsID0JMiwKCQkJ XzI0Yml0c1BlclBpeGVsID0JMywKCQkJXzMyYml0c1BlclBpeGVsV2l0aE92ID0gNCwKCQkJXzMy Yml0c1BlclBpeGVsCT0JNywKCglEYWNfWHBhbmVsbW9kZSA9CTB4MWYsCgoJRGFjX1htaXNjY3Ry bCA9CQkweDFlLAoJCURhY3BkbiA9CSgxPDwwKSwKCQlNZmNzZWwgPQkoMzw8MSksCgkJVmdhOGRh YyA9CSgxPDwzKSwKCQlSYW1jcyA9CQkoMTw8NCksCgkJVmRvdXRzZWwgPQkoNzw8NSksCgoJRGFj X1hjdXJjdHJsID0JCTB4MDYsCgkJQ3Vyc29yRGlzID0gCTAsCgkJQ3Vyc29yM0NvbG9yID0gCTEs CgkJQ3Vyc29yWEdBID0gCTIsCgkJQ3Vyc29yWDExID0gCTMsCgkJQ3Vyc29yMTZDb2xvciA9IDQs CgoJRGFjX1h6b29tY3RybCA9CQkweDM4LAoKCU1pc2NfbG9hZGRzZWwgPQkJKDE8PDApLAoJTWlz Y19yYW1tYXBlbiA9CQkoMTw8MSksCglNaXNjX2Nsa3NlbCA9CQkoMzw8MiksCglNaXNjX3ZpZGVv ZGlzID0JCSgxPDw0KSwKCU1pc2NfaHBnb2RkZXYgPSAJKDE8PDUpLAoJTWlzY19oc3luY3BvbCA9 CQkoMTw8NiksCglNaXNjX3ZzeW5jcG9sID0JCSgxPDw3KSwKfTsKCnN0YXRpYyB2b2lkCmxvYWQo VmdhKiB2Z2EsIEN0bHIqIGN0bHIpCnsKCU1nYSoJbWdhOwoJaW50CWk7Cgl1Y2hhcioJcDsKCU1v ZGUqCW1vZGU7Cgl1Y2hhcgljdXJzb3I7CgoJbWdhID0gdmdhLT5wcml2YXRlOwoJbW9kZSA9IHZn YS0+bW9kZTsKCgl0cmFjZSgibWdhOiBMb2FkaW5nIC4uLlxuIik7CglkdW1wX2FsbF9yZWdzKG1n YSk7CgoJdHJhY2UoIm1nYSBtbWlvIGF0ICVseFxuIiwgbWdhLT5tbWlvKTsKCgoJdHJhY2UoIm1n YTogbG9hZGluZyB2Z2EgcmVnaXN0ZXJzIC4uLlxuIiApOwoKCS8qIEluaXRpYWxpemUgU2VxdWVu Y2VyIHJlZ2lzdGVycyAqLwoJZm9yKGkgPSAwOyBpIDwgNTsgaSsrKQoJCXNlcXNldChtZ2EsIGks IG1nYS0+c2VxdWVuY2VyW2ldLCAweGZmKTsKCgkvKiBJbml0aWFsaXplIEF0dHJpYnV0ZSByZWdp c3RlciAqLwoJZm9yKGkgPSAwOyBpIDwgMHgxNTsgaSsrKQoJCWF0dHJzZXQobWdhLCBpLCBtZ2Et PmF0dHJpYnV0ZVtpXSwgMHhmZik7CgoJLyogSW5pdGlhbGl6ZSBHcmFwaGljIENvbnRyb2wgcmVn aXN0ZXJzICovCglmb3IoaSA9IDA7IGkgPCA5OyBpKyspCgkJZ2N0bHNldChtZ2EsIGksIG1nYS0+ Z3JhcGhpY3NbaV0sIDB4ZmYpOwoKCS8qIFdhaXQgVlNZTkMgKi8KCXdoaWxlIChtZ2FyZWFkOCht Z2EsIFNUQVRVUzEpICYgMHgwOCk7Cgl3aGlsZSAoISAobWdhcmVhZDgobWdhLCBTVEFUVVMxKSAm IH4weDA4KSk7CgoJLyogVHVybiBvZmYgdGhlIHZpZGVvLiAqLwoJc2Vxc2V0KG1nYSwgU2VxX0Ns b2NraW5nTW9kZSwgU2Nyb2ZmLCAwKTsKCgkvKiBDcnRjMiBPZmYgKi8KCW1nYXdyaXRlMzIobWdh LCBDMl9DVEwsIDApOwoKCS8qIERpc2FibGUgQ3Vyc29yICovCgljdXJzb3IgPSBkYWNzZXQobWdh LCBEYWNfWGN1cmN0cmwsIEN1cnNvckRpcywgMHhmZik7CgoJLyogUGl4ZWwgUGxsIFVQIGFuZCBz ZXQgUGl4ZWwgY2xvY2sgc291cmNlIHRvIFBpeGVsIENsb2NrIFBMTCAqLwoJZGFjc2V0KG1nYSwg RGFjX1hwaXhjbGtjdHJsLCAweDAxIHwgMHgwOCwgMHgwZik7CgoJdHJhY2UoIm1nYTogd2FpdGlu ZyBmb3IgdGhlIGNsb2NrIHNvdXJjZSBiZWNvbWVzIHN0YWJsZSAuLi5cbiIpOwoJd2hpbGUgKChk YWNnZXQobWdhLCBEYWNfWHBpeHBsbHN0YXQpICYgUGl4bG9jaykgIT0gUGl4bG9jaykKCQk7Cgl0 cmFjZSgibWdhOiBwaXhwbGwgbG9ja2VkICFcbiIpOwoKCS8qIEVuYWJsZSBMVVQsIERpc2FibGUg TUFGQyAqLwoJZGFjc2V0KG1nYSwgRGFjX1htaXNjY3RybCwgUmFtY3MgfCBNZmNzZWwsIFZkb3V0 c2VsKTsKCgkvKiBJbml0aWFsaXplIFogQnVmZmVyIC4uLiAodXNlZnVsPykgKi8KCW1nYXdyaXRl MzIobWdhLCBaX0RFUFRIX09SRywgMCk7CgoJLyogRGlzYWJsZSBEYWMgKi8KCWRhY3NldChtZ2Es IERhY19YbWlzY2N0cmwsIDAsIERhY3Bkbik7CgoJLyogSW5pdGlhbGl6ZSBQYW5lbCBNb2RlICov CglkYWNzZXQobWdhLCBEYWNfWHBhbmVsbW9kZSwgMCwgMHhmZik7CgoJLyogRGlzYWJsZSB0aGUg UElYQ0xLIGFuZCBzZXQgUGl4ZWwgY2xvY2sgc291cmNlIHRvIFBpeGVsIENsb2NrIFBMTCAqLwoJ ZGFjc2V0KG1nYSwgRGFjX1hwaXhjbGtjdHJsLCBQaXhjbGtkaXMgfCAweDAxLCAweDMpOwoKCS8q IERpc2FibGUgbWFwcGluZyBvZiB0aGUgbWVtb3J5ICovIAoJbWlzY3NldChtZ2EsIDAsIE1pc2Nf cmFtbWFwZW4pOwoKCS8qIEVuYWJsZSA4IGJpdCBwYWxldHRlICovCglkYWNzZXQobWdhLCBEYWNf WG1pc2NjdHJsLCBWZ2E4ZGFjLCAwKTsKCgkvKiBTZWxlY3QgTUdBIFBpeGVsIENsb2NrICovCglt aXNjc2V0KG1nYSwgTWlzY19jbGtzZWwsIDApOwoKCS8qIFdhaXQgKi8KCWZvciAoaSA9IDA7IGkg PCA1MDsgaSsrKQoJCW1nYXJlYWQzMihtZ2EsIE1HQV9TVEFUVVMpOwoKCS8qIFJlcHJvZ3JhbSB0 aGUgZGVzaXJlZCBQTEwgcmVnaXN0ZXJzICovCglkYWNzZXQobWdhLCBEYWNfWHBpeHBsbGNtLCBt Z2EtPnBpeHBsbF9tLCAweGZmKTsKCWRhY3NldChtZ2EsIERhY19YcGl4cGxsY24sIG1nYS0+cGl4 cGxsX24sIDB4ZmYpOwoJZGFjc2V0KG1nYSwgRGFjX1hwaXhwbGxjcCwgbWdhLT5waXhwbGxfcCwg MHhmZik7CgkKCS8qIFdhaXQgdW50aWwgbmV3IGNsb2NrIGJlY29tZXMgc3RhYmxlICovCgl0cmFj ZSgibWdhOiB3YWl0aW5nIGZvciB0aGUgY2xvY2sgc291cmNlIGJlY29tZXMgc3RhYmxlIC4uLlxu Iik7Cgl3aGlsZSAoKGRhY2dldChtZ2EsIERhY19YcGl4cGxsc3RhdCkgJiBQaXhsb2NrKSAhPSBQ aXhsb2NrKQoJCTsKCXRyYWNlKCJtZ2E6IHBpeHBsbCBsb2NrZWQgIVxuIik7CgoJLyogRW5hYmxl IFBpeGVsIENsb2NrIE9zY2lsbGF0aW9uICovCglkYWNzZXQobWdhLCBEYWNfWHBpeGNsa2N0cmws IDAsIFBpeGNsa2Rpcyk7CgoJLyogRW5hYmxlIERhYyAqLwoJZGFjc2V0KG1nYSwgRGFjX1htaXNj Y3RybCwgRGFjcGRuLCAwKTsKCgkvKiBTZXQgVmlkZW8gTW9kZSAqLwoJaWYgKG1vZGUtPnogIT0g OCkKCQlkYWNzZXQobWdhLCBEYWNfWG11bGN0cmwsIF8zMmJpdHNQZXJQaXhlbCwgQ29sb3JEZXB0 aCk7CS8qIDMyIGJpdHMgbW9kZSAuLi4gKi8KCWVsc2UKCQlkYWNzZXQobWdhLCBEYWNfWG11bGN0 cmwsIF84Yml0c1BlclBpeGVsLCBDb2xvckRlcHRoKTsJLyogOCBiaXRzIG1vZGUgLi4uICovCgoJ LyogV2FpdCAqLwoJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspCgkJbWdhcmVhZDMyKG1nYSwgTUdB X1NUQVRVUyk7CgoJLyogU2V0IFZpZGVvIE1vZGUgKi8KCWlmIChtb2RlLT56ICE9IDgpCgkJZGFj c2V0KG1nYSwgRGFjX1htdWxjdHJsLCBfMzJiaXRzUGVyUGl4ZWwsIENvbG9yRGVwdGgpOwkvKiAz MiBiaXRzIG1vZGUgLi4uICovCgllbHNlCgkJZGFjc2V0KG1nYSwgRGFjX1htdWxjdHJsLCBfOGJp dHNQZXJQaXhlbCwgQ29sb3JEZXB0aCk7CS8qIDggYml0cyBtb2RlIC4uLiAqLwoKCS8qIFdhaXQg dW50aWwgbmV3IGNsb2NrIGJlY29tZXMgc3RhYmxlICovCgl0cmFjZSgibWdhOiB3YWl0aW5nIGZv ciB0aGUgY2xvY2sgc291cmNlIGJlY29tZXMgc3RhYmxlIC4uLlxuIik7Cgl3aGlsZSAoKGRhY2dl dChtZ2EsIERhY19YcGl4cGxsc3RhdCkgJiBQaXhsb2NrKSAhPSBQaXhsb2NrKQoJCTsKCXRyYWNl KCJtZ2E6IHBpeHBsbCBsb2NrZWQgIVxuIik7CgoJLyogSW5pdGlhbGl6ZSBDUlRDIHJlZ2lzdGVy cyBhbmQgcmVtb3ZlIGlycSAqLwoJY3J0Y3NldChtZ2EsIDB4MTEsICgxPDw0KSwgKDE8PDUpfDB4 ODApOwoJZm9yIChpID0gMDsgaSA8IDI1OyBpKyspCgkJY3J0Y3NldChtZ2EsIGksIG1nYS0+Y3J0 Y1tpXSwgMHhmZik7CgoJLyogSW5pdGlhbGl6ZSBDUlRDIEV4dGVuc2lvbiByZWdpc3RlcnMgKi8K CWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCgkJY3J0Y2V4dHNldChtZ2EsIGksIG1nYS0+Y3J0Y2V4 dFtpXSwgMHhmZik7CgoJLyogSW5pdGlhbGl6ZSBQYWxldHRlICovCgltZ2F3cml0ZTgobWdhLCBS QU1EQUNJRFgsIDApOwoJZm9yIChpID0gMDsgaSA8IDB4ZmY7IGkrKykKCQltZ2F3cml0ZTgobWdh LCBSQU1EQUNQQUxEQVRBLCBpKTsKCgkvKiBEaXNhYmxlIFpvb20gKi8KCWRhY3NldChtZ2EsIERh Y19Yem9vbWN0cmwsIDAsIDB4ZmYpOwoKCS8qIEVuYWJsZSBtZ2EgbW9kZSBhZ2FpbiAuLi4gSnVz dCBpbiBjYXNlIDopICovCgljcnRjZXh0c2V0KG1nYSwgQ3J0Y0V4dF9NaXNjZWxsYW5lb3VzLCBN Z2Ftb2RlLCAwKTsKCgkvKiBTZXQgZmluYWwgbWlzYyAuLi4gZW5hYmxlIG1hcHBpbmcgLi4uICov CgltaXNjc2V0KG1nYSwgbWdhLT5taXNjIHwgTWlzY19yYW1tYXBlbiwgMCk7CgoJLyogRW5hYmxl IFNjcmVlbiAqLwoJc2Vxc2V0KG1nYSwgMSwgMCwgMHhmZik7CgoJcCA9ICh1Y2hhciopbWdhLT5t bWZiOwoJZm9yIChpID0gMDsgaSA8IG1nYS0+ZmJzaXplOyBpKyspCgkJKnArKyA9ICgweGZmICYg aSk7CgoJdHJhY2UoIm1nYTogTG9hZGVkICFcbiIgKTsKCWR1bXBfYWxsX3JlZ3MobWdhKTsKCgl0 cmFjZSgibWdhOiBMb2FkZWQgW2Jpc10hXG4iICk7CgoJLyogUmVlbmFibGUgQ3Vyc29yICovCglk YWNzZXQobWdhLCBEYWNfWGN1cmN0cmwsIGN1cnNvciwgMHhmZik7CgoJY3Rsci0+ZmxhZyB8PSBG bG9hZDsKfQoKQ3RsciBtZ2E0eHggPSB7CgkibWdhNHh4IiwJCQkvKiBuYW1lICovCglzbmFyZiwJ CQkJLyogc25hcmYgKi8KCW9wdGlvbnMsCQkJCS8qIG9wdGlvbnMgKi8KCWluaXQsCQkJCQkvKiBp bml0ICovCglsb2FkLAkJCQkJLyogbG9hZCAqLwoJZHVtcCwJCQkJLyogZHVtcCAqLwp9OwoKQ3Rs ciBtZ2E0eHhod2djID0gewoJIm1nYTR4eGh3Z2MiLAkJLyogbmFtZSAqLwoJMCwJCQkJCS8qIHNu YXJmICovCgkwLAkJCQkJLyogb3B0aW9ucyAqLwoJMCwJCQkJCS8qIGluaXQgKi8KCTAsCQkJCQkv KiBsb2FkICovCglkdW1wLAkJCQkvKiBkdW1wICovCn07Cg== --=====================_273202==_--