LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNwZWNpZmljIHRvIENhcmQgU2VydmljZXMKICogICBkZXZpY2VzIChQQ01DSUEsIENGKS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGluY2x1ZGUgZmlsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2luLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgojaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgojaW5jbHVkZSA8cGNtY2lhL2RzLmg+CiNpbmNsdWRlIDxkZWJ1Zy5oPgoKI2luY2x1ZGUgPGhjZi5oPgojaW5jbHVkZSA8ZGhmLmg+CiNpbmNsdWRlIDxoY2ZkZWYuaD4KCiNpbmNsdWRlIDx3bF9pZi5oPgojaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KI2luY2x1ZGUgPHdsX3V0aWwuaD4KI2luY2x1ZGUgPHdsX21haW4uaD4KI2luY2x1ZGUgPHdsX25ldGRldi5oPgojaW5jbHVkZSA8d2xfY3MuaD4KI2luY2x1ZGUgPHdsX3N5c2ZzLmg+CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGdsb2JhbCBkZWZpbml0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgREJHCmV4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOwojZW5kaWYgIC8qIERCRyAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfYXR0YWNoKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yCiAqICBvbmUgZGV2aWNlLiBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkIFNlcnZpY2VzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBub25lCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGRldl9saW5rX3Qgc3RydWN0dXJlCiAqICAgICAgTlVMTCBvbiBmYWlsdXJlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbnQgd2xfYWRhcHRlcl9hdHRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldjsKICAgIHN0cnVjdCB3bF9wcml2YXRlCSpscDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfYXR0YWNoIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgZGV2ID0gd2xfZGV2aWNlX2FsbG9jKCk7CiAgICBpZihkZXYgPT0gTlVMTCkgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIndsX2RldmljZV9hbGxvYyByZXR1cm5lZCBOVUxMXG4iKTsKCXJldHVybiAtRU5PTUVNOwogICAgfQoKICAgIGxpbmstPmlvLk51bVBvcnRzMSAgICAgID0gSENGX05VTV9JT19QT1JUUzsKICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxICAgID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OwogICAgbGluay0+aW8uSU9BZGRyTGluZXMgICAgPSA2OwogICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzICAgPSBDT05GX0VOQUJMRV9JUlE7CiAgICBsaW5rLT5jb25mLkludFR5cGUgICAgICA9IElOVF9NRU1PUllfQU5EX0lPOwogICAgbGluay0+Y29uZi5Db25maWdJbmRleCAgPSA1OwogICAgbGluay0+Y29uZi5QcmVzZW50ICAgICAgPSBQUkVTRU5UX09QVElPTjsKCiAgICBsaW5rLT5wcml2ID0gZGV2OwogICAgbHAgPSB3bF9wcml2KGRldik7CiAgICBscC0+bGluayA9IGxpbms7CgogICAgd2xfYWRhcHRlcl9pbnNlcnQobGluayk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF9hZGFwdGVyX2F0dGFjaAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2RldGFjaCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkIHdpdGggQ2FyZAogKiAgU2VydmljZXMuIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCB0aGVuIHRoZSBuZXQgZGV2aWNlIGlzIHVucmVnaXN0ZXJlZCwgYW5kCiAqICBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlCiAqICBmcmVlZCB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxpbmsgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRldmljZSB0bwogKiAgICAgICAgICAgICAgICBkZXRhY2gKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIHdsX2FkYXB0ZXJfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSBsaW5rLT5wcml2OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfZGV0YWNoIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rICk7CgogICAgd2xfYWRhcHRlcl9yZWxlYXNlKGxpbmspOwoKICAgIGlmIChkZXYpIHsKCXVucmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoZGV2KTsKCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAgICB9CgogICAgd2xfZGV2aWNlX2RlYWxsb2MoZGV2KTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKfSAvLyB3bF9hZGFwdGVyX2RldGFjaAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfcmVsZWFzZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgdGhpcyByb3V0aW5lIHdpbGwgcmVsZWFzZSB0aGUgUENNQ0lBCiAqICBjb25maWd1cmF0aW9uLiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQKICogIGlzIGNsb3NlZC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgYXJnIC0gYSB1X2xvbmcgcmVwcmVzZW50aW5nIGEgcG9pbnRlciB0byBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGZvciB0aGUKICogICAgICAgICAgICBkZXZpY2UgdG8gYmUgcmVsZWFzZWQuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX2FkYXB0ZXJfcmVsZWFzZSggc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgKQp7CiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfcmVsZWFzZSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibGluayIsICIweCVwIiwgbGluayk7CgogICAgLyogU3RvcCBoYXJkd2FyZSAqLwogICAgd2xfcmVtb3ZlKGxpbmstPnByaXYpOwoKICAgIHBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKfSAvLyB3bF9hZGFwdGVyX3JlbGVhc2UKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyBpbnQgd2xfYWRhcHRlcl9zdXNwZW5kKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKCiAgICAvL2lmIChsaW5rLT5vcGVuKSB7CgluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7Cgl3bF9zdXNwZW5kKGRldik7Ci8vLy8gQ0hFQ0shICAgICAgICAgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOwogICAgLy99CgogICAgcmV0dXJuIDA7Cn0gLy8gd2xfYWRhcHRlcl9zdXNwZW5kCgpzdGF0aWMgaW50IHdsX2FkYXB0ZXJfcmVzdW1lKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKCgl3bF9yZXN1bWUoZGV2KTsKCgluZXRpZl9kZXZpY2VfYXR0YWNoKCBkZXYgKTsKCglyZXR1cm4gMDsKfSAvLyB3bF9hZGFwdGVyX3Jlc3VtZQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9pbnNlcnQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgd2xfYWRhcHRlcl9pbnNlcnQoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQgaXMKICogIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZSBldGhlcm5ldCBkZXZpY2UKICogIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBsaW5rICAgIC0gcG9pbnRlciB0byB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UgdG8KICogICAgICAgICAgICAgICAgaW5zZXJ0CiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX2FkYXB0ZXJfaW5zZXJ0KCBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayApCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7CiAgICBpbnQgaTsKICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJldDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5zZXJ0IiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rICk7CgogICAgZGV2ICAgICA9IGxpbmstPnByaXY7CgogICAgLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCiAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwoKICAgIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CiAgICBpZiAocmV0ICE9IDApCiAgICAgICAgZ290byBmYWlsZWQ7CgogICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICh2b2lkICopIHdsX2lzcik7CiAgICBpZiAocmV0ICE9IDApCiAgICAgICAgZ290byBmYWlsZWQ7CgogICAgcmV0ID0gcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZik7CiAgICBpZiAocmV0ICE9IDApCiAgICAgICAgZ290byBmYWlsZWQ7CgogICAgZGV2LT5pcnEgICAgICAgID0gbGluay0+aXJxOwogICAgZGV2LT5iYXNlX2FkZHIgID0gbGluay0+aW8uQmFzZVBvcnQxOwoKICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmxpbmstPmRldik7CiAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgewoJcHJpbnRrKCIlczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iLCBNT0RVTEVfTkFNRSk7Cglnb3RvIGZhaWxlZDsKICAgIH0KCiAgICByZWdpc3Rlcl93bGFnc19zeXNmcyhkZXYpOwoKICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBXaXJlbGVzcywgaW9fYWRkciAlIzAzbHgsIGlycSAlZCwgIiJtYWNfYWRkcmVzcyAiLAogICAgICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CiAgICBmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKICAgICAgICBwcmludGsoIiUwMlglYyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaSA8IChFVEhfQUxFTi0xKSkgPyAnOicgOiAnXG4nKSk7CiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47CgpmYWlsZWQ6CiAgICB3bF9hZGFwdGVyX3JlbGVhc2UoIGxpbmsgKTsKCiAgICBEQkdfTEVBVkUoRGJnSW5mbyk7CiAgICByZXR1cm47Cn0gLy8gd2xfYWRhcHRlcl9pbnNlcnQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX29wZW4oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgT3BlbiB0aGUgZGV2aWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIG5ldHdvcmsKICogICAgICAgICAgICBkZXZpY2UgdG8gb3Blbi4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9hZGFwdGVyX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGxwLT5saW5rOwogICAgaW50ICAgICAgICAgcmVzdWx0ID0gMDsKICAgIGludCAgICAgICAgIGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX29wZW4iICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCURCR19QUklOVCggIiVzXG4iLCBWRVJTSU9OX0lORk8gKTsKICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwoKICAgIGlmKCFwY21jaWFfZGV2X3ByZXNlbnQobGluaykpCiAgICB7CiAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICB9CgogICAgbGluay0+b3BlbisrOwoKICAgIGhjZl9zdGF0dXMgPSB3bF9vcGVuKCBkZXYgKTsKCiAgICBpZiggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKICAgICAgICBsaW5rLT5vcGVuLS07CiAgICAgICAgcmVzdWx0ID0gLUVOT0RFVjsKICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiByZXN1bHQ7Cn0gLy8gd2xfYWRhcHRlcl9vcGVuCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9jbG9zZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDbG9zZSB0aGUgZGV2aWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIG5ldHdvcmsKICogICAgICAgICAgICBkZXZpY2UgdG8gY2xvc2UuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfYWRhcHRlcl9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbG9zZSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CgogICAgaWYoIGxpbmsgPT0gTlVMTCApIHsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgIH0KCiAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIlczogU2h1dHRpbmcgZG93biBhZGFwdGVyLlxuIiwgZGV2LT5uYW1lICk7CiAgICB3bF9jbG9zZSggZGV2ICk7CgogICAgbGluay0+b3Blbi0tOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIDA7Cn0gLy8gd2xfYWRhcHRlcl9jbG9zZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHdsX2FkYXB0ZXJfaWRzW10gPSB7CiNpZiAhICgoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSkKCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAzKSwKCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBZ2VyZSBTeXN0ZW1zIiwgIldpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIsCgkJCSAgICAweDMzMTAzYTliLCAweGUxNzViMGRkKSwKI2Vsc2UKCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDA0KSwKCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMaW5rc3lzIiwgIldDRjU0R19XaXJlbGVzcy1HX0NvbXBhY3RGbGFzaF9DYXJkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDczM2NjODEsIDB4OThhNTk5ZTEpLAojZW5kaWYgIC8vIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1CglQQ01DSUFfREVWSUNFX05VTEwsCgl9OwpNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgd2xfYWRhcHRlcl9pZHMpOwoKc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHdsYWdzNDlfZHJpdmVyID0gewogICAgLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAgICAuZHJ2ICAgICAgICAgICAgPSB7CgkubmFtZSAgID0gRFJJVkVSX05BTUUsCiAgICB9LAogICAgLnByb2JlCT0gd2xfYWRhcHRlcl9hdHRhY2gsCiAgICAucmVtb3ZlCT0gd2xfYWRhcHRlcl9kZXRhY2gsCiAgICAuaWRfdGFibGUJPSB3bF9hZGFwdGVyX2lkcywKICAgIC5zdXNwZW5kCT0gd2xfYWRhcHRlcl9zdXNwZW5kLAogICAgLnJlc3VtZQk9IHdsX2FkYXB0ZXJfcmVzdW1lLAp9OwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENhbGxlZCBieSBpbml0X21vZHVsZSgpIHRvIHBlcmZvcm0gUENNQ0lBIGRyaXZlciBpbml0aWFsaXphdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgTi9BCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIC0xIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCB2b2lkICkKewogICAgaW50IHJldDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkgLS0gUENNQ0lBXG4iICk7CgogICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmd2xhZ3M0OV9kcml2ZXIpOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIHJldDsKfSAvLyB3bF9hZGFwdGVyX2luaXRfbW9kdWxlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDYWxsZWQgYnkgY2xlYW51cF9tb2R1bGUoKSB0byBwZXJmb3JtIGRyaXZlciB1bmluaXRpYWxpemF0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBOL0EKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSggdm9pZCApCnsKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSgpIC0tIFBDTUNJQVxuIiApOwoKCiAgICBwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndsYWdzNDlfZHJpdmVyKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9pc19vcGVuKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENoZWNrIHdpdGggQ2FyZCBTZXJ2aWNlcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBkZXZpY2UgaXMgb3Blbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSB3aG9zZSBvcGVuIHN0YXR1cyB3aWxsIGJlCiAqICAgICAgICAgICAgY2hlY2tlZAogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBub256ZXJvIGlmIGRldmljZSBpcyBvcGVuCiAqICAgICAgMCBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FkYXB0ZXJfaXNfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CgogICAgaWYoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHJldHVybiggbGluay0+b3BlbiApOwp9IC8vIHdsX2FkYXB0ZXJfaXNfb3BlbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCiNpZiBEQkcKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURiZ0V2ZW50KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENvbnZlcnRzIHRoZSBjYXJkIHNlcml2Y2VzIGV2ZW50cyB0byB0ZXh0IGZvciBkZWJ1Z2dpbmcuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIG1hc2sgICAgLSBhIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBlcnJvcihzKSBiZWluZyByZXBvcnRlZCBieSBDYXJkCiAqICAgICAgICAgICAgICAgIFNlcnZpY2VzLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IocykKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KY29uc3QgY2hhciogRGJnRXZlbnQoIGludCBtYXNrICkKewogICAgc3RhdGljIGNoYXIgRGJnQnVmZmVyWzI1Nl07CiAgICBjaGFyICpwQnVmOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBwQnVmICAgID0gRGJnQnVmZmVyOwogICAgKnBCdWYgICA9ICdcMCc7CgoKICAgIGlmKCBtYXNrICYgQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCApCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiV1JJVEVfUFJPVEVDVCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfTE9DSykKICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX0xPQ0sgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikKICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX0lOU0VSVElPTiAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfUkVNT1ZBTCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX1JFTU9WQUwgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9CQVRURVJZX0RFQUQpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiQkFUVEVSWV9ERUFEICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9MT1cpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiQkFUVEVSWV9MT1cgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRUFEWV9DSEFOR0UpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVBRFlfQ0hBTkdFICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9ERVRFQ1QpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9ERVRFQ1QgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9SRVFVRVNUKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFU0VUX1JFUVVFU1QgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJSRVNFVF9QSFlTSUNBTCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfUkVTRVQpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9SRVNFVCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURSkKICAgICAgICBzdHJjYXQoIHBCdWYsICJSRUdJU1RSQVRJT05fQ09NUExFVEUgIiApOwoKICAgIC8vIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9DT01QTEVURSkKICAgIC8vICAgICBzdHJjYXQoIHBCdWYsICJSRVNFVF9DT01QTEVURSAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX1BNX1NVU1BFTkQpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiUE1fU1VTUEVORCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX1BNX1JFU1VNRSkKICAgICAgICBzdHJjYXQoIHBCdWYsICJQTV9SRVNVTUUgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9JTlNFUlRJT05fUkVRVUVTVCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJJTlNFUlRJT05fUkVRVUVTVCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0VKRUNUSU9OX1JFUVVFU1QpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiRUpFQ1RJT05fUkVRVUVTVCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX01URF9SRVFVRVNUKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIk1URF9SRVFVRVNUICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfRVJBU0VfQ09NUExFVEUpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiRVJBU0VfQ09NUExFVEUgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVFVRVNUX0FUVEVOVElPTikKICAgICAgICBzdHJjYXQoIHBCdWYsICJSRVFVRVNUX0FUVEVOVElPTiAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0NCX0RFVEVDVCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJDQl9ERVRFQ1QgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF8zVkNBUkQpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiM1ZDQVJEICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfWFZDQVJEKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIlhWQ0FSRCAiICk7CgoKICAgIGlmKCAqcEJ1ZiApIHsKICAgICAgICBwQnVmW3N0cmxlbihwQnVmKSAtIDFdID0gJ1wwJzsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYoIG1hc2sgIT0gMHgwICkgewogICAgICAgICAgICBzcHJpbnRmKCBwQnVmLCAiPDwweCUwOHg+PiIsIG1hc2sgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHBCdWY7Cn0gLy8gRGJnRXZlbnQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiNlbmRpZiAgLyogREJHICovCg==