LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNwZWNpZmljIHRvIENhcmQgU2VydmljZXMKICogICBkZXZpY2VzIChQQ01DSUEsIENGKS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGluY2x1ZGUgZmlsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2luLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgojaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CiNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgojaW5jbHVkZSA8cGNtY2lhL2RzLmg+CiNpbmNsdWRlIDxkZWJ1Zy5oPgoKI2luY2x1ZGUgPGhjZi5oPgojaW5jbHVkZSA8ZGhmLmg+CiNpbmNsdWRlIDxoY2ZkZWYuaD4KCiNpbmNsdWRlIDx3bF9pZi5oPgojaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KI2luY2x1ZGUgPHdsX3V0aWwuaD4KI2luY2x1ZGUgPHdsX21haW4uaD4KI2luY2x1ZGUgPHdsX25ldGRldi5oPgojaW5jbHVkZSA8d2xfY3MuaD4KI2luY2x1ZGUgPHdsX3N5c2ZzLmg+CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIG1hY3JvIGRlZmluaXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgZG8geyBcCiAgICAgICAgICAgICAgICAgICAgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IFwKICAgICAgICAgICAgfSB3aGlsZSAoMCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBnbG9iYWwgZGVmaW5pdGlvbnMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIERCRwpleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKI2VuZGlmICAvKiBEQkcgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2F0dGFjaCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvcgogKiAgb25lIGRldmljZS4gVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbm9uZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBkZXZfbGlua190IHN0cnVjdHVyZQogKiAgICAgIE5VTEwgb24gZmFpbHVyZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50IHdsX2FkYXB0ZXJfYXR0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQp7CiAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXY7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZQkqbHA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2F0dGFjaCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIGRldiA9IHdsX2RldmljZV9hbGxvYygpOwogICAgaWYoZGV2ID09IE5VTEwpIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9kZXZpY2VfYWxsb2MgcmV0dXJuZWQgTlVMTFxuIik7CglyZXR1cm4gLUVOT01FTTsKICAgIH0KCiAgICBsaW5rLT5pby5OdW1Qb3J0czEgICAgICA9IEhDRl9OVU1fSU9fUE9SVFM7CiAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSAgICA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKICAgIGxpbmstPmlvLklPQWRkckxpbmVzICAgID0gNjsKICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzICAgID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HIHwgSVJRX0hBTkRMRV9QUkVTRU5UOwogICAgbGluay0+aXJxLklSUUluZm8xICAgICAgPSBJUlFfSU5GTzJfVkFMSUQgfCBJUlFfTEVWRUxfSUQ7CiAgICBsaW5rLT5pcnEuSGFuZGxlciAgICAgICA9ICZ3bF9pc3I7CiAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgICA9IENPTkZfRU5BQkxFX0lSUTsKICAgIGxpbmstPmNvbmYuSW50VHlwZSAgICAgID0gSU5UX01FTU9SWV9BTkRfSU87CiAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ICA9IDU7CiAgICBsaW5rLT5jb25mLlByZXNlbnQgICAgICA9IFBSRVNFTlRfT1BUSU9OOwoKICAgIGxpbmstPnByaXYgPSBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CiAgICBscCA9IHdsX3ByaXYoZGV2KTsKICAgIGxwLT5saW5rID0gbGluazsKCiAgICB3bF9hZGFwdGVyX2luc2VydChsaW5rKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX2FkYXB0ZXJfYXR0YWNoCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfZGV0YWNoKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aCBDYXJkCiAqICBTZXJ2aWNlcy4gSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIHRoZW4gdGhlIG5ldCBkZXZpY2UgaXMgdW5yZWdpc3RlcmVkLCBhbmQKICogIGFsbCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUKICogIGZyZWVkIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbGluayAgICAtIHBvaW50ZXIgdG8gdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgZGV2aWNlIHRvCiAqICAgICAgICAgICAgICAgIGRldGFjaAogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQgd2xfYWRhcHRlcl9kZXRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IGxpbmstPnByaXY7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9kZXRhY2giICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKICAgIERCR19QQVJBTSggRGJnSW5mbywgImxpbmsiLCAiMHglcCIsIGxpbmsgKTsKCiAgICB3bF9hZGFwdGVyX3JlbGVhc2UobGluayk7CgogICAgaWYgKGRldikgewoJdW5yZWdpc3Rlcl93bGFnc19zeXNmcyhkZXYpOwoJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKICAgIH0KCiAgICB3bF9kZXZpY2VfZGVhbGxvYyhkZXYpOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwp9IC8vIHdsX2FkYXB0ZXJfZGV0YWNoCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9yZWxlYXNlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCB0aGlzIHJvdXRpbmUgd2lsbCByZWxlYXNlIHRoZSBQQ01DSUEKICogIGNvbmZpZ3VyYXRpb24uIElmIHRoZSBkZXZpY2UgaXMgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdAogKiAgaXMgY2xvc2VkLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBhcmcgLSBhIHVfbG9uZyByZXByZXNlbnRpbmcgYSBwb2ludGVyIHRvIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgZm9yIHRoZQogKiAgICAgICAgICAgIGRldmljZSB0byBiZSByZWxlYXNlZC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfYWRhcHRlcl9yZWxlYXNlKCBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayApCnsKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9yZWxlYXNlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rKTsKCiAgICAvKiBTdG9wIGhhcmR3YXJlICovCiAgICB3bF9yZW1vdmUobGluay0+cHJpdik7CgogICAgcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwp9IC8vIHdsX2FkYXB0ZXJfcmVsZWFzZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIGludCB3bF9hZGFwdGVyX3N1c3BlbmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwoKICAgIC8vaWYgKGxpbmstPm9wZW4pIHsKCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKCXdsX3N1c3BlbmQoZGV2KTsKLy8vLyBDSEVDSyEgICAgICAgICAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CiAgICAvL30KCiAgICByZXR1cm4gMDsKfSAvLyB3bF9hZGFwdGVyX3N1c3BlbmQKCnN0YXRpYyBpbnQgd2xfYWRhcHRlcl9yZXN1bWUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwoKCXdsX3Jlc3VtZShkZXYpOwoKCW5ldGlmX2RldmljZV9hdHRhY2goIGRldiApOwoKCXJldHVybiAwOwp9IC8vIHdsX2FkYXB0ZXJfcmVzdW1lCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2luc2VydCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICB3bF9hZGFwdGVyX2luc2VydCgpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudCBpcwogKiAgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlIGV0aGVybmV0IGRldmljZQogKiAgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxpbmsgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRldmljZSB0bwogKiAgICAgICAgICAgICAgICBpbnNlcnQKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfYWRhcHRlcl9pbnNlcnQoIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rICkKewogICAgc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKICAgIGludCBpOwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgbGFzdF9mbiwgbGFzdF9yZXQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2luc2VydCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibGluayIsICIweCVwIiwgbGluayApOwoKICAgIGRldiAgICAgPSBsaW5rLT5wcml2OwoKICAgIC8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLwogICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKCiAgICBDU19DSEVDSyhSZXF1ZXN0SU8sIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbykpOwogICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKSk7CgoKICAgIGRldi0+aXJxICAgICAgICA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKICAgIGRldi0+YmFzZV9hZGRyICA9IGxpbmstPmlvLkJhc2VQb3J0MTsKCiAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGxpbmspKTsKICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CglwcmludGsoIiVzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIsIE1PRFVMRV9OQU1FKTsKCWdvdG8gZmFpbGVkOwogICAgfQogICAgbGluay0+ZGV2X25vZGUgPSAmKCB3bF9wcml2KGRldikgKS0+bm9kZTsKICAgIHN0cmNweSgoIHdsX3ByaXYoZGV2KSApLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOwogICAgcmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoZGV2KTsKCiAgICBwcmludGsoS0VSTl9JTkZPICIlczogV2lyZWxlc3MsIGlvX2FkZHIgJSMwM2x4LCBpcnEgJWQsICIibWFjX2FkZHJlc3MgIiwKICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOwogICAgZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CiAgICAgICAgcHJpbnRrKCIlMDJYJWMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGkgPCAoRVRIX0FMRU4tMSkpID8gJzonIDogJ1xuJykpOwogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwoKCmNzX2ZhaWxlZDoKICAgIGNzX2Vycm9yKCBsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCApOwoKCmZhaWxlZDoKICAgIHdsX2FkYXB0ZXJfcmVsZWFzZSggbGluayApOwoKICAgIERCR19MRUFWRShEYmdJbmZvKTsKICAgIHJldHVybjsKfSAvLyB3bF9hZGFwdGVyX2luc2VydAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfb3BlbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBPcGVuIHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgbmV0d29yawogKiAgICAgICAgICAgIGRldmljZSB0byBvcGVuLgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FkYXB0ZXJfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CiAgICBpbnQgICAgICAgICByZXN1bHQgPSAwOwogICAgaW50ICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfb3BlbiIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoJREJHX1BSSU5UKCAiJXNcbiIsIFZFUlNJT05fSU5GTyApOwogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CgogICAgaWYoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkKICAgIHsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgIH0KCiAgICBsaW5rLT5vcGVuKys7CgogICAgaGNmX3N0YXR1cyA9IHdsX29wZW4oIGRldiApOwoKICAgIGlmKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewogICAgICAgIGxpbmstPm9wZW4tLTsKICAgICAgICByZXN1bHQgPSAtRU5PREVWOwogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIHJlc3VsdDsKfSAvLyB3bF9hZGFwdGVyX29wZW4KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2Nsb3NlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENsb3NlIHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgbmV0d29yawogKiAgICAgICAgICAgIGRldmljZSB0byBjbG9zZS4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9hZGFwdGVyX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBscC0+bGluazsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2Nsb3NlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCiAgICBpZiggbGluayA9PSBOVUxMICkgewogICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgICAgIHJldHVybiAtRU5PREVWOwogICAgfQoKICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiBTaHV0dGluZyBkb3duIGFkYXB0ZXIuXG4iLCBkZXYtPm5hbWUgKTsKICAgIHdsX2Nsb3NlKCBkZXYgKTsKCiAgICBsaW5rLT5vcGVuLS07CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF9hZGFwdGVyX2Nsb3NlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgd2xfYWRhcHRlcl9pZHNbXSA9IHsKI2lmICEgKChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1KQoJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDMpLAoJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFnZXJlIFN5c3RlbXMiLCAiV2lyZWxlc3MgUEMgQ2FyZCBNb2RlbCAwMTEwIiwKCQkJICAgIDB4MzMxMDNhOWIsIDB4ZTE3NWIwZGQpLAojZWxzZQoJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDQpLAoJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxpbmtzeXMiLCAiV0NGNTRHX1dpcmVsZXNzLUdfQ29tcGFjdEZsYXNoX0NhcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzMzY2M4MSwgMHg5OGE1OTllMSksCiNlbmRpZiAgLy8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKCVBDTUNJQV9ERVZJQ0VfTlVMTCwKCX07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB3bF9hZGFwdGVyX2lkcyk7CgpzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgd2xhZ3M0OV9kcml2ZXIgPSB7CiAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKICAgIC5kcnYgICAgICAgICAgICA9IHsKCS5uYW1lICAgPSBEUklWRVJfTkFNRSwKICAgIH0sCiAgICAucHJvYmUJPSB3bF9hZGFwdGVyX2F0dGFjaCwKICAgIC5yZW1vdmUJPSB3bF9hZGFwdGVyX2RldGFjaCwKICAgIC5pZF90YWJsZQk9IHdsX2FkYXB0ZXJfaWRzLAogICAgLnN1c3BlbmQJPSB3bF9hZGFwdGVyX3N1c3BlbmQsCiAgICAucmVzdW1lCT0gd2xfYWRhcHRlcl9yZXN1bWUsCn07CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2FsbGVkIGJ5IGluaXRfbW9kdWxlKCkgdG8gcGVyZm9ybSBQQ01DSUEgZHJpdmVyIGluaXRpYWxpemF0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBOL0EKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgLTEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoIHZvaWQgKQp7CiAgICBpbnQgcmV0OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKSAtLSBQQ01DSUFcbiIgKTsKCiAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZ3bGFnczQ5X2RyaXZlcik7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gcmV0Owp9IC8vIHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpIHRvIHBlcmZvcm0gZHJpdmVyIHVuaW5pdGlhbGl6YXRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIE4vQQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCB2b2lkICkKewogICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCkgLS0gUENNQ0lBXG4iICk7CgoKICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmd2xhZ3M0OV9kcml2ZXIpOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2lzX29wZW4oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2hlY2sgd2l0aCBDYXJkIFNlcnZpY2VzIHRvIGRldGVybWluZSBpZiB0aGlzIGRldmljZSBpcyBvcGVuLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdob3NlIG9wZW4gc3RhdHVzIHdpbGwgYmUKICogICAgICAgICAgICBjaGVja2VkCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIG5vbnplcm8gaWYgZGV2aWNlIGlzIG9wZW4KICogICAgICAwIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfYWRhcHRlcl9pc19vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogICAgc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBscC0+bGluazsKCiAgICBpZighcGNtY2lhX2Rldl9wcmVzZW50KGxpbmspKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuKCBsaW5rLT5vcGVuICk7Cn0gLy8gd2xfYWRhcHRlcl9pc19vcGVuCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKI2lmIERCRwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRGJnRXZlbnQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ29udmVydHMgdGhlIGNhcmQgc2VyaXZjZXMgZXZlbnRzIHRvIHRleHQgZm9yIGRlYnVnZ2luZy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbWFzayAgICAtIGEgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGVycm9yKHMpIGJlaW5nIHJlcG9ydGVkIGJ5IENhcmQKICogICAgICAgICAgICAgICAgU2VydmljZXMuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIGEgcG9pbnRlciB0byBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvcihzKQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpjb25zdCBjaGFyKiBEYmdFdmVudCggaW50IG1hc2sgKQp7CiAgICBzdGF0aWMgY2hhciBEYmdCdWZmZXJbMjU2XTsKICAgIGNoYXIgKnBCdWY7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAgIHBCdWYgICAgPSBEYmdCdWZmZXI7CiAgICAqcEJ1ZiAgID0gJ1wwJzsKCgogICAgaWYoIG1hc2sgJiBDU19FVkVOVF9XUklURV9QUk9URUNUICkKICAgICAgICBzdHJjYXQoIHBCdWYsICJXUklURV9QUk9URUNUICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9MT0NLKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfTE9DSyAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfSU5TRVJUSU9OICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfUkVNT1ZBTCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0JBVFRFUllfREVBRCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJCQVRURVJZX0RFQUQgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9CQVRURVJZX0xPVykKICAgICAgICBzdHJjYXQoIHBCdWYsICJCQVRURVJZX0xPVyAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX1JFQURZX0NIQU5HRSkKICAgICAgICBzdHJjYXQoIHBCdWYsICJSRUFEWV9DSEFOR0UgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX0RFVEVDVCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX0RFVEVDVCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX1JFU0VUX1JFUVVFU1QpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVTRVRfUkVRVUVTVCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFU0VUX1BIWVNJQ0FMICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9SRVNFVCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJDQVJEX1JFU0VUICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFR0lTVFJBVElPTl9DT01QTEVURSAiICk7CgogICAgLy8gaWYobWFzayAmIENTX0VWRU5UX1JFU0VUX0NPTVBMRVRFKQogICAgLy8gICAgIHN0cmNhdCggcEJ1ZiwgIlJFU0VUX0NPTVBMRVRFICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfUE1fU1VTUEVORCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJQTV9TVVNQRU5EICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfUE1fUkVTVU1FKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIlBNX1JFU1VNRSAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX0lOU0VSVElPTl9SRVFVRVNUKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIklOU0VSVElPTl9SRVFVRVNUICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfRUpFQ1RJT05fUkVRVUVTVCkKICAgICAgICBzdHJjYXQoIHBCdWYsICJFSkVDVElPTl9SRVFVRVNUICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfTVREX1JFUVVFU1QpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiTVREX1JFUVVFU1QgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9FUkFTRV9DT01QTEVURSkKICAgICAgICBzdHJjYXQoIHBCdWYsICJFUkFTRV9DT01QTEVURSAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UX1JFUVVFU1RfQVRURU5USU9OKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFUVVFU1RfQVRURU5USU9OICIgKTsKCiAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0JfREVURUNUKQogICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNCX0RFVEVDVCAiICk7CgogICAgaWYobWFzayAmIENTX0VWRU5UXzNWQ0FSRCkKICAgICAgICBzdHJjYXQoIHBCdWYsICIzVkNBUkQgIiApOwoKICAgIGlmKG1hc2sgJiBDU19FVkVOVF9YVkNBUkQpCiAgICAgICAgc3RyY2F0KCBwQnVmLCAiWFZDQVJEICIgKTsKCgogICAgaWYoICpwQnVmICkgewogICAgICAgIHBCdWZbc3RybGVuKHBCdWYpIC0gMV0gPSAnXDAnOwogICAgfSBlbHNlIHsKICAgICAgICBpZiggbWFzayAhPSAweDAgKSB7CiAgICAgICAgICAgIHNwcmludGYoIHBCdWYsICI8PDB4JTA4eD4+IiwgbWFzayApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcEJ1ZjsKfSAvLyBEYmdFdmVudAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2VuZGlmICAvKiBEQkcgKi8K