VXBzdHJlYW0tU3RhdHVzOiBJbmFwcHJvcHJpYXRlIFtjb25maWd1cmF0aW9uXQoKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9BQk9VVC1OTFMJMTk5OC0wNC0yNiAwOToyMjozMC4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvQUJPVVQtTkxTCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzIzNzUyOTUyIC0wNDAwCkBAIC0xLDE0ICsxLDE0IEBACiBOb3RlcyBvbiB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgIEZyZWUgc29mdHdhcmUgaXMgZ29pbmcgaW50ZXJuYXRpb25hbCEgIFRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QKLWlzIGEgd2F5IHRvIGdldCBtYWludGFpbmVycyBvZiBmcmVlIHNvZnR3YXJlLCB0cmFuc2xhdG9ycywgYW5kIHVzZXJzIGFsbAorRnJlZSBzb2Z0d2FyZSBpcyBnb2luZyBpbnRlcm5hdGlvbmFsISAgVGhlIEZyZWUgVHJhbnNsYXRpb24gUHJvamVjdCBpcworYSB3YXkgdG8gZ2V0IG1haW50YWluZXJzIG9mIGZyZWUgc29mdHdhcmUsIHRyYW5zbGF0b3JzLCBhbmQgdXNlcnMgYWxsCiB0b2dldGhlciwgc28gdGhhdCB3aWxsIGdyYWR1YWxseSBiZWNvbWUgYWJsZSB0byBzcGVhayBtYW55IGxhbmd1YWdlcy4KIEEgZmV3IHBhY2thZ2VzIGFscmVhZHkgcHJvdmlkZSB0cmFuc2xhdGlvbnMgZm9yIHRoZWlyIG1lc3NhZ2VzLgogCiAgICBJZiB5b3UgZm91bmQgdGhpcyBgQUJPVVQtTkxTJyBmaWxlIGluc2lkZSBhIGRpc3RyaWJ1dGlvbiwgeW91IG1heQogYXNzdW1lIHRoYXQgdGhlIGRpc3RyaWJ1dGVkIHBhY2thZ2UgZG9lcyB1c2UgR05VIGBnZXR0ZXh0JyBpbnRlcm5hbGx5LAotaXRzZWxmIGF2YWlsYWJsZSBhdCB5b3VyIG5lYXJlc3QgR05VIGFyY2hpdmUgc2l0ZS4gIEJ1dCB5b3UgZG8gKm5vdCoKK2l0c2VsZiBhdmFpbGFibGUgYXQgeW91ciBuZWFyZXN0IEdOVSBhcmNoaXZlIHNpdGUuICBCdXQgeW91IGRvIF9ub3RfCiBuZWVkIHRvIGluc3RhbGwgR05VIGBnZXR0ZXh0JyBwcmlvciB0byBjb25maWd1cmluZywgaW5zdGFsbGluZyBvciB1c2luZwogdGhpcyBwYWNrYWdlIHdpdGggbWVzc2FnZXMgdHJhbnNsYXRlZC4KIApAQCAtMjIsMTAgKzIyLDEwIEBACiBgZ2V0dGV4dCcgd2hpY2ggaXMgdXNlZC4gIFRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCiBgaW50bC9WRVJTSU9OJyBmaWxlLCBpbiBpbnRlcm5hdGlvbmFsaXplZCBwYWNrYWdlcy4KIAotT25lIGFkdmlzZSBpbiBhZHZhbmNlCi09PT09PT09PT09PT09PT09PT09PT0KK1F1aWNrIGNvbmZpZ3VyYXRpb24gYWR2aWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gICBJZiB5b3Ugd2FudCB0byBleHBsb2l0IHRoZSBmdWxsIHBvd2VyIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCB5b3UKK0lmIHlvdSB3YW50IHRvIGV4cGxvaXQgdGhlIGZ1bGwgcG93ZXIgb2YgaW50ZXJuYXRpb25hbGl6YXRpb24sIHlvdQogc2hvdWxkIGNvbmZpZ3VyZSBpdCB1c2luZwogCiAgICAgIC4vY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0CkBAIC0zNCw0MiArMzQsNDAgQEAKIHBhY2thZ2UsIGRlc3BpdGUgdGhlIGV4aXN0ZW5jZSBvZiBpbnRlcm5hdGlvbmFsaXppbmcgY2FwYWJpbGl0aWVzIGluIHRoZQogb3BlcmF0aW5nIHN5c3RlbSB3aGVyZSB0aGlzIHBhY2thZ2UgaXMgYmVpbmcgaW5zdGFsbGVkLiAgU28gZmFyLCBvbmx5CiB0aGUgYGdldHRleHQnIGltcGxlbWVudGF0aW9uIGluIHRoZSBHTlUgQyBsaWJyYXJ5IHZlcnNpb24gMiBwcm92aWRlcyBhcwotbWFueSBmZWF0dXJlcyAoc3VjaCBhcyBsb2NhbGUgYWxpYXMgb3IgbWVzc2FnZSBpbmhlcml0YW5jZSkgYXMgdGhlCi1pbXBsZW1lbnRhdGlvbiBoZXJlLiAgSXQgaXMgYWxzbyBub3QgcG9zc2libGUgdG8gb2ZmZXIgdGhpcyBhZGRpdGlvbmFsCi1mdW5jdGlvbmFsaXR5IG9uIHRvcCBvZiBhIGBjYXRnZXRzJyBpbXBsZW1lbnRhdGlvbi4gIEZ1dHVyZSB2ZXJzaW9ucyBvZgotR05VIGBnZXR0ZXh0JyB3aWxsIHZlcnkgbGlrZWx5IGNvbnZleSBldmVuIG1vcmUgZnVuY3Rpb25hbGl0eS4gIFNvIGl0Ci1taWdodCBiZSBhIGdvb2QgaWRlYSB0byBjaGFuZ2UgdG8gR05VIGBnZXR0ZXh0JyBhcyBzb29uIGFzIHBvc3NpYmxlLgorbWFueSBmZWF0dXJlcyAoc3VjaCBhcyBsb2NhbGUgYWxpYXMsIG1lc3NhZ2UgaW5oZXJpdGFuY2UsIGF1dG9tYXRpYworY2hhcnNldCBjb252ZXJzaW9uIG9yIHBsdXJhbCBmb3JtIGhhbmRsaW5nKSBhcyB0aGUgaW1wbGVtZW50YXRpb24gaGVyZS4KK0l0IGlzIGFsc28gbm90IHBvc3NpYmxlIHRvIG9mZmVyIHRoaXMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IG9uIHRvcAorb2YgYSBgY2F0Z2V0cycgaW1wbGVtZW50YXRpb24uICBGdXR1cmUgdmVyc2lvbnMgb2YgR05VIGBnZXR0ZXh0JyB3aWxsCit2ZXJ5IGxpa2VseSBjb252ZXkgZXZlbiBtb3JlIGZ1bmN0aW9uYWxpdHkuICBTbyBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYQordG8gY2hhbmdlIHRvIEdOVSBgZ2V0dGV4dCcgYXMgc29vbiBhcyBwb3NzaWJsZS4KIAotICAgU28geW91IG5lZWQgbm90IHByb3ZpZGUgdGhpcyBvcHRpb24gaWYgeW91IGFyZSB1c2luZyBHTlUgbGliYyAyIG9yCisgICBTbyB5b3UgbmVlZCBfbm90XyBwcm92aWRlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgdXNpbmcgR05VIGxpYmMgMiBvcgogeW91IGhhdmUgaW5zdGFsbGVkIGEgcmVjZW50IGNvcHkgb2YgdGhlIEdOVSBnZXR0ZXh0IHBhY2thZ2Ugd2l0aCB0aGUKIGluY2x1ZGVkIGBsaWJpbnRsJy4KIAogSU5TVEFMTCBNYXR0ZXJzCiA9PT09PT09PT09PT09PT0KIAotICAgU29tZSBwYWNrYWdlcyBhcmUgImxvY2FsaXphYmxlIiB3aGVuIHByb3Blcmx5IGluc3RhbGxlZDsgdGhlCi1wcm9ncmFtcyB0aGV5IGNvbnRhaW4gY2FuIGJlIG1hZGUgdG8gc3BlYWsgeW91ciBvd24gbmF0aXZlIGxhbmd1YWdlLgotTW9zdCBzdWNoIHBhY2thZ2VzIHVzZSBHTlUgYGdldHRleHQnLiAgT3RoZXIgcGFja2FnZXMgaGF2ZSB0aGVpciBvd24KLXdheXMgdG8gaW50ZXJuYXRpb25hbGl6YXRpb24sIHByZWRhdGluZyBHTlUgYGdldHRleHQnLgorU29tZSBwYWNrYWdlcyBhcmUgImxvY2FsaXphYmxlIiB3aGVuIHByb3Blcmx5IGluc3RhbGxlZDsgdGhlIHByb2dyYW1zCit0aGV5IGNvbnRhaW4gY2FuIGJlIG1hZGUgdG8gc3BlYWsgeW91ciBvd24gbmF0aXZlIGxhbmd1YWdlLiAgTW9zdCBzdWNoCitwYWNrYWdlcyB1c2UgR05VIGBnZXR0ZXh0Jy4gIE90aGVyIHBhY2thZ2VzIGhhdmUgdGhlaXIgb3duIHdheXMgdG8KK2ludGVybmF0aW9uYWxpemF0aW9uLCBwcmVkYXRpbmcgR05VIGBnZXR0ZXh0Jy4KIAogICAgQnkgZGVmYXVsdCwgdGhpcyBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkIHRvIGFsbG93IHRyYW5zbGF0aW9uIG9mCi1tZXNzYWdlcy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0aGUgc3lzdGVtIHByb3ZpZGVzCi11c2FibGUgYGNhdGdldHMnIChpZiB1c2luZyB0aGlzIGlzIHNlbGVjdGVkIGJ5IHRoZSBpbnN0YWxsZXIpIG9yCi1gZ2V0dGV4dCcgZnVuY3Rpb25zLiAgSWYgbmVpdGhlciBpcyBhdmFpbGFibGUsIHRoZSBHTlUgYGdldHRleHQnIG93bgorbWVzc2FnZXMuICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHdoZXRoZXIgdGhlIHN5c3RlbSBhbHJlYWR5Citwcm92aWRlcyB0aGUgR05VIGBnZXR0ZXh0JyBmdW5jdGlvbnMuICBJZiBub3QsIHRoZSBHTlUgYGdldHRleHQnIG93bgogbGlicmFyeSB3aWxsIGJlIHVzZWQuICBUaGlzIGxpYnJhcnkgaXMgd2hvbGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhpcwogcGFja2FnZSwgdXN1YWxseSBpbiB0aGUgYGludGwvJyBzdWJkaXJlY3RvcnksIHNvIHByaW9yIGluc3RhbGxhdGlvbiBvZgotdGhlIEdOVSBgZ2V0dGV4dCcgcGFja2FnZSBpcyAqbm90KiByZXF1aXJlZC4gIEluc3RhbGxlcnMgbWF5IHVzZQordGhlIEdOVSBgZ2V0dGV4dCcgcGFja2FnZSBpcyBfbm90XyByZXF1aXJlZC4gIEluc3RhbGxlcnMgbWF5IHVzZQogc3BlY2lhbCBvcHRpb25zIGF0IGNvbmZpZ3VyYXRpb24gdGltZSBmb3IgY2hhbmdpbmcgdGhlIGRlZmF1bHQKIGJlaGF2aW91ci4gIFRoZSBjb21tYW5kczoKIAogICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dAotICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtY2F0Z2V0cwogICAgICAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtbmxzCiAKLXdpbGwgcmVzcGVjdGl2ZWx5IGJ5cGFzcyBhbnkgcHJlLWV4aXN0aW5nIGBjYXRnZXRzJyBvciBgZ2V0dGV4dCcgdG8gdXNlCi10aGUgaW50ZXJuYXRpb25hbGl6aW5nIHJvdXRpbmVzIHByb3ZpZGVkIHdpdGhpbiB0aGlzIHBhY2thZ2UsIGVuYWJsZQotdGhlIHVzZSBvZiB0aGUgYGNhdGdldHMnIGZ1bmN0aW9ucyAoaWYgZm91bmQgb24gdGhlIGxvY2FsZSBzeXN0ZW0pLCBvcgotZWxzZSwgKnRvdGFsbHkqIGRpc2FibGUgdHJhbnNsYXRpb24gb2YgbWVzc2FnZXMuCit3aWxsIHJlc3BlY3RpdmVseSBieXBhc3MgYW55IHByZS1leGlzdGluZyBgZ2V0dGV4dCcgdG8gdXNlIHRoZQoraW50ZXJuYXRpb25hbGl6aW5nIHJvdXRpbmVzIHByb3ZpZGVkIHdpdGhpbiB0aGlzIHBhY2thZ2UsIG9yIGVsc2UsCitfdG90YWxseV8gZGlzYWJsZSB0cmFuc2xhdGlvbiBvZiBtZXNzYWdlcy4KIAogICAgV2hlbiB5b3UgYWxyZWFkeSBoYXZlIEdOVSBgZ2V0dGV4dCcgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFuZCBydW4KIGNvbmZpZ3VyZSB3aXRob3V0IGFuIG9wdGlvbiBmb3IgeW91ciBuZXcgcGFja2FnZSwgYGNvbmZpZ3VyZScgd2lsbApAQCAtODMsMTggKzgxLDEwIEBACiAKIHRvIHByZXZlbnQgYXV0by1kZXRlY3Rpb24uCiAKLSAgIEJ5IGRlZmF1bHQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIG5vdCB0ZXN0IGZvciB0aGUgYGNhdGdldHMnCi1mdW5jdGlvbiBhbmQgdGhlcmVmb3JlIHRoZXkgd2lsbCBub3QgYmUgdXNlZC4gIFRoZSByZWFzb25zIGFyZSBhbHJlYWR5Ci1naXZlbiBhYm92ZTogdGhlIGVtdWxhdGlvbiBvbiB0b3Agb2YgYGNhdGdldHMnIGNhbm5vdCBwcm92aWRlIGFsbCB0aGUKLWV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgdGhlIEdOVSBgZ2V0dGV4dCcgbGlicmFyeS4gIElmIHlvdSBuZXZlcnRoZWxlc3MKLXdhbnQgdG8gdXNlIHRoZSBgY2F0Z2V0cycgZnVuY3Rpb25zIHVzZQotCi0gICAgIC4vY29uZmlndXJlIC0td2l0aC1jYXRnZXRzCi0KLXRvIGVuYWJsZSB0aGUgdGVzdCBmb3IgYGNhdGdldHMnICh0aGlzIGNhdXNlcyBubyBoYXJtIGlmIGBjYXRnZXRzJyBpcwotbm90IGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbSkuICBJZiB5b3UgcmVhbGx5IHNlbGVjdCB0aGlzIG9wdGlvbiB3ZQotd291bGQgbGlrZSB0byBoZWFyIGFib3V0IHRoZSByZWFzb25zIGJlY2F1c2Ugd2UgY2Fubm90IHRoaW5rIG9mIGFueQotZ29vZCBvbmUgb3Vyc2VsZi4KKyAgIFRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Mgd2lsbCBub3QgdGVzdCBmb3IgdGhlIGBjYXRnZXRzJyBmdW5jdGlvbgorYW5kIHRoZXJlZm9yZSBpdCB3aWxsIG5vdCBiZSB1c2VkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGV2ZW4gYW4KK2VtdWxhdGlvbiBvZiBgZ2V0dGV4dCcgb24gdG9wIG9mIGBjYXRnZXRzJyBjb3VsZCBub3QgcHJvdmlkZSBhbGwgdGhlCitleHRlbnNpb25zIG9mIHRoZSBHTlUgYGdldHRleHQnIGxpYnJhcnkuCiAKICAgIEludGVybmF0aW9uYWxpemVkIHBhY2thZ2VzIGhhdmUgdXN1YWxseSBtYW55IGBwby9MTC5wbycgZmlsZXMsIHdoZXJlCiBMTCBnaXZlcyBhbiBJU08gNjM5IHR3by1sZXR0ZXIgY29kZSBpZGVudGlmeWluZyB0aGUgbGFuZ3VhZ2UuICBVbmxlc3MKQEAgLTEwOCw1NyArOTgsNzMgQEAKIFVzaW5nIFRoaXMgUGFja2FnZQogPT09PT09PT09PT09PT09PT09CiAKLSAgIEFzIGEgdXNlciwgaWYgeW91ciBsYW5ndWFnZSBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcGFja2FnZSwgeW91CitBcyBhIHVzZXIsIGlmIHlvdXIgbGFuZ3VhZ2UgaGFzIGJlZW4gaW5zdGFsbGVkIGZvciB0aGlzIHBhY2thZ2UsIHlvdQogb25seSBoYXZlIHRvIHNldCB0aGUgYExBTkcnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZQotSVNPIDYzOSBgTEwnIHR3by1sZXR0ZXIgY29kZSBwcmlvciB0byB1c2luZyB0aGUgcHJvZ3JhbXMgaW4gdGhlCi1wYWNrYWdlLiAgRm9yIGV4YW1wbGUsIGxldCdzIHN1cHBvc2UgdGhhdCB5b3Ugc3BlYWsgR2VybWFuLiAgQXQgdGhlCi1zaGVsbCBwcm9tcHQsIG1lcmVseSBleGVjdXRlIGBzZXRlbnYgTEFORyBkZScgKGluIGBjc2gnKSwKLWBleHBvcnQgTEFORzsgTEFORz1kZScgKGluIGBzaCcpIG9yIGBleHBvcnQgTEFORz1kZScgKGluIGBiYXNoJykuICBUaGlzCi1jYW4gYmUgZG9uZSBmcm9tIHlvdXIgYC5sb2dpbicgb3IgYC5wcm9maWxlJyBmaWxlLCBvbmNlIGFuZCBmb3IgYWxsLgorYExMX0NDJyBjb21iaW5hdGlvbi4gIEhlcmUgYExMJyBpcyBhbiBJU08gNjM5IHR3by1sZXR0ZXIgbGFuZ3VhZ2UgY29kZSwKK2FuZCBgQ0MnIGlzIGFuIElTTyAzMTY2IHR3by1sZXR0ZXIgY291bnRyeSBjb2RlLiAgRm9yIGV4YW1wbGUsIGxldCdzCitzdXBwb3NlIHRoYXQgeW91IHNwZWFrIEdlcm1hbiBhbmQgbGl2ZSBpbiBHZXJtYW55LiAgQXQgdGhlIHNoZWxsCitwcm9tcHQsIG1lcmVseSBleGVjdXRlIGBzZXRlbnYgTEFORyBkZV9ERScgKGluIGBjc2gnKSwKK2BleHBvcnQgTEFORzsgTEFORz1kZV9ERScgKGluIGBzaCcpIG9yIGBleHBvcnQgTEFORz1kZV9ERScgKGluIGBiYXNoJykuCitUaGlzIGNhbiBiZSBkb25lIGZyb20geW91ciBgLmxvZ2luJyBvciBgLnByb2ZpbGUnIGZpbGUsIG9uY2UgYW5kIGZvcgorYWxsLgogCi0gICBBbiBvcGVyYXRpbmcgc3lzdGVtIG1pZ2h0IGFscmVhZHkgb2ZmZXIgbWVzc2FnZSBsb2NhbGl6YXRpb24gZm9yCi1tYW55IG9mIGl0cyBwcm9ncmFtcywgd2hpbGUgb3RoZXIgcHJvZ3JhbXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBsb2NhbGx5Ci13aXRoIHRoZSBmdWxsIGNhcGFiaWxpdGllcyBvZiBHTlUgYGdldHRleHQnLiAgSnVzdCB1c2luZyBgZ2V0dGV4dCcKLWV4dGVuZGVkIHN5bnRheCBmb3IgYExBTkcnIHdvdWxkIGJyZWFrIHByb3BlciBsb2NhbGl6YXRpb24gb2YgYWxyZWFkeQotYXZhaWxhYmxlIG9wZXJhdGluZyBzeXN0ZW0gcHJvZ3JhbXMuICBJbiB0aGlzIGNhc2UsIHVzZXJzIHNob3VsZCBzZXQKLWJvdGggYExBTkdVQUdFJyBhbmQgYExBTkcnIHZhcmlhYmxlcyBpbiB0aGVpciBlbnZpcm9ubWVudCwgYXMgcHJvZ3JhbXMKLXVzaW5nIEdOVSBgZ2V0dGV4dCcgZ2l2ZSBwcmVmZXJlbmNlIHRvIGBMQU5HVUFHRScuICBGb3IgZXhhbXBsZSwgc29tZQotU3dlZGlzaCB1c2VycyB3b3VsZCByYXRoZXIgcmVhZCB0cmFuc2xhdGlvbnMgaW4gR2VybWFuIHRoYW4gRW5nbGlzaCBmb3IKLXdoZW4gU3dlZGlzaCBpcyBub3QgYXZhaWxhYmxlLiAgVGhpcyBpcyBlYXNpbHkgYWNjb21wbGlzaGVkIGJ5IHNldHRpbmcKLWBMQU5HVUFHRScgdG8gYHN2OmRlJyB3aGlsZSBsZWF2aW5nIGBMQU5HJyB0byBgc3YnLgorICAgWW91IG1pZ2h0IHRoaW5rIHRoYXQgdGhlIGNvdW50cnkgY29kZSBzcGVjaWZpY2F0aW9uIGlzIHJlZHVuZGFudC4KK0J1dCBpbiBmYWN0LCBzb21lIGxhbmd1YWdlcyBoYXZlIGRpYWxlY3RzIGluIGRpZmZlcmVudCBjb3VudHJpZXMuICBGb3IKK2V4YW1wbGUsIGBkZV9BVCcgaXMgdXNlZCBmb3IgQXVzdHJpYSwgYW5kIGBwdF9CUicgZm9yIEJyYXppbC4gIFRoZQorY291bnRyeSBjb2RlIHNlcnZlcyB0byBkaXN0aW5ndWlzaCB0aGUgZGlhbGVjdHMuCisKKyAgIFRoZSBsb2NhbGUgbmFtaW5nIGNvbnZlbnRpb24gb2YgYExMX0NDJywgd2l0aCBgTEwnIGRlbm90aW5nIHRoZQorbGFuZ3VhZ2UgYW5kIGBDQycgZGVub3RpbmcgdGhlIGNvdW50cnksIGlzIHRoZSBvbmUgdXNlIG9uIHN5c3RlbXMgYmFzZWQKK29uIEdOVSBsaWJjLiAgT24gb3RoZXIgc3lzdGVtcywgc29tZSB2YXJpYXRpb25zIG9mIHRoaXMgc2NoZW1lIGFyZQordXNlZCwgc3VjaCBhcyBgTEwnIG9yIGBMTF9DQy5FTkNPRElORycuICBZb3UgY2FuIGdldCB0aGUgbGlzdCBvZgorbG9jYWxlcyBzdXBwb3J0ZWQgYnkgeW91ciBzeXN0ZW0gZm9yIHlvdXIgY291bnRyeSBieSBydW5uaW5nIHRoZSBjb21tYW5kCitgbG9jYWxlIC1hIHwgZ3JlcCAnXkxMJycuCisKKyAgIE5vdCBhbGwgcHJvZ3JhbXMgaGF2ZSB0cmFuc2xhdGlvbnMgZm9yIGFsbCBsYW5ndWFnZXMuICBCeSBkZWZhdWx0LCBhbgorRW5nbGlzaCBtZXNzYWdlIGlzIHNob3duIGluIHBsYWNlIG9mIGEgbm9uZXhpc3RlbnQgdHJhbnNsYXRpb24uICBJZiB5b3UKK3VuZGVyc3RhbmQgb3RoZXIgbGFuZ3VhZ2VzLCB5b3UgY2FuIHNldCB1cCBhIHByaW9yaXR5IGxpc3Qgb2YgbGFuZ3VhZ2VzLgorVGhpcyBpcyBkb25lIHRocm91Z2ggYSBkaWZmZXJlbnQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGNhbGxlZAorYExBTkdVQUdFJy4gIEdOVSBgZ2V0dGV4dCcgZ2l2ZXMgcHJlZmVyZW5jZSB0byBgTEFOR1VBR0UnIG92ZXIgYExBTkcnCitmb3IgdGhlIHB1cnBvc2Ugb2YgbWVzc2FnZSBoYW5kbGluZywgYnV0IHlvdSBzdGlsbCBuZWVkIHRvIGhhdmUgYExBTkcnCitzZXQgdG8gdGhlIHByaW1hcnkgbGFuZ3VhZ2U7IHRoaXMgaXMgcmVxdWlyZWQgYnkgb3RoZXIgcGFydHMgb2YgdGhlCitzeXN0ZW0gbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUsIHNvbWUgU3dlZGlzaCB1c2VycyB3aG8gd291bGQgcmF0aGVyCityZWFkIHRyYW5zbGF0aW9ucyBpbiBHZXJtYW4gdGhhbiBFbmdsaXNoIGZvciB3aGVuIFN3ZWRpc2ggaXMgbm90CithdmFpbGFibGUsIHNldCBgTEFOR1VBR0UnIHRvIGBzdjpkZScgd2hpbGUgbGVhdmluZyBgTEFORycgdG8gYHN2X1NFJy4KKworICAgU3BlY2lhbCBhZHZpY2UgZm9yIE5vcndlZ2lhbiB1c2VyczogVGhlIGxhbmd1YWdlIGNvZGUgZm9yIE5vcndlZ2lhbgorYm9rbWEqbCBjaGFuZ2VkIGZyb20gYG5vJyB0byBgbmInIHJlY2VudGx5IChpbiAyMDAzKS4gIER1cmluZyB0aGUKK3RyYW5zaXRpb24gcGVyaW9kLCB3aGlsZSBzb21lIG1lc3NhZ2UgY2F0YWxvZ3MgZm9yIHRoaXMgbGFuZ3VhZ2UgYXJlCitpbnN0YWxsZWQgdW5kZXIgYG5iJyBhbmQgc29tZSBvbGRlciBvbmVzIHVuZGVyIGBubycsIGl0J3MgcmVjb21tZW5kZWQKK2ZvciBOb3J3ZWdpYW4gdXNlcnMgdG8gc2V0IGBMQU5HVUFHRScgdG8gYG5iOm5vJyBzbyB0aGF0IGJvdGggbmV3ZXIgYW5kCitvbGRlciB0cmFuc2xhdGlvbnMgYXJlIHVzZWQuCisKKyAgIEluIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgbm90IGluIHRoZSBgTEFORycKK2Vudmlyb25tZW50IHZhcmlhYmxlLCBgTExfQ0MnIGNvbWJpbmF0aW9ucyBjYW4gYmUgYWJicmV2aWF0ZWQgYXMgYExMJwordG8gZGVub3RlIHRoZSBsYW5ndWFnZSdzIG1haW4gZGlhbGVjdC4gIEZvciBleGFtcGxlLCBgZGUnIGlzIGVxdWl2YWxlbnQKK3RvIGBkZV9ERScgKEdlcm1hbiBhcyBzcG9rZW4gaW4gR2VybWFueSksIGFuZCBgcHQnIHRvIGBwdF9QVCcKKyhQb3J0dWd1ZXNlIGFzIHNwb2tlbiBpbiBQb3J0dWdhbCkgaW4gdGhpcyBjb250ZXh0LgogCiBUcmFuc2xhdGluZyBUZWFtcwogPT09PT09PT09PT09PT09PT0KIAotICAgRm9yIHRoZSBGcmVlIFRyYW5zbGF0aW9uIFByb2plY3QgdG8gYmUgYSBzdWNjZXNzLCB3ZSBuZWVkIGludGVyZXN0ZWQKK0ZvciB0aGUgRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IHRvIGJlIGEgc3VjY2Vzcywgd2UgbmVlZCBpbnRlcmVzdGVkCiBwZW9wbGUgd2hvIGxpa2UgdGhlaXIgb3duIGxhbmd1YWdlIGFuZCB3cml0ZSBpdCB3ZWxsLCBhbmQgd2hvIGFyZSBhbHNvCiBhYmxlIHRvIHN5bmVyZ2l6ZSB3aXRoIG90aGVyIHRyYW5zbGF0b3JzIHNwZWFraW5nIHRoZSBzYW1lIGxhbmd1YWdlLgotRWFjaCB0cmFuc2xhdGlvbiB0ZWFtIGhhcyBpdHMgb3duIG1haWxpbmcgbGlzdCwgY291cnRlc3kgb2YgTGludXgKLUludGVybmF0aW9uYWwuICBZb3UgbWF5IHJlYWNoIHlvdXIgdHJhbnNsYXRpb24gdGVhbSBhdCB0aGUgYWRkcmVzcwotYExMQGxpLm9yZycsIHJlcGxhY2luZyBMTCBieSB0aGUgdHdvLWxldHRlciBJU08gNjM5IGNvZGUgZm9yIHlvdXIKLWxhbmd1YWdlLiAgTGFuZ3VhZ2UgY29kZXMgYXJlICpub3QqIHRoZSBzYW1lIGFzIHRoZSBjb3VudHJ5IGNvZGVzIGdpdmVuCi1pbiBJU08gMzE2Ni4gIFRoZSBmb2xsb3dpbmcgdHJhbnNsYXRpb24gdGVhbXMgZXhpc3QsIGFzIG9mIEF1Z3VzdCAxOTk3OgotCi0gICAgIENoaW5lc2UgYHpoJywgQ3plY2ggYGNzJywgRGFuaXNoIGBkYScsIER1dGNoIGBubCcsIEVuZ2xpc2ggYGVuJywKLSAgICAgRXNwZXJhbnRvIGBlbycsIEZpbm5pc2ggYGZpJywgRnJlbmNoIGBmcicsIEdlcm1hbiBgZGUnLCBIdW5nYXJpYW4KLSAgICAgYGh1JywgSXJpc2ggYGdhJywgSXRhbGlhbiBgaXQnLCBJbmRvbmVzaWFuIGBpZCcsIEphcGFuZXNlIGBqYScsCi0gICAgIEtvcmVhbiBga28nLCBMYXRpbiBgbGEnLCBOb3J3ZWdpYW4gYG5vJywgUGVyc2lhbiBgZmEnLCBQb2xpc2gKLSAgICAgYHBsJywgUG9ydHVndWVzZSBgcHQnLCBSdXNzaWFuIGBydScsIFNsb3ZlbmlhbiBgc2wnLCBTcGFuaXNoIGBlcycsCi0gICAgIFN3ZWRpc2ggYHN2JywgYW5kIFR1cmtpc2ggYHRyJy4KLQotRm9yIGV4YW1wbGUsIHlvdSBtYXkgcmVhY2ggdGhlIENoaW5lc2UgdHJhbnNsYXRpb24gdGVhbSBieSB3cml0aW5nIHRvCi1gemhAbGkub3JnJy4KK0VhY2ggdHJhbnNsYXRpb24gdGVhbSBoYXMgaXRzIG93biBtYWlsaW5nIGxpc3QuICBUaGUgdXAtdG8tZGF0ZSBsaXN0IG9mCit0ZWFtcyBjYW4gYmUgZm91bmQgYXQgdGhlIEZyZWUgVHJhbnNsYXRpb24gUHJvamVjdCdzIGhvbWVwYWdlLAorYGh0dHA6Ly93d3cuaXJvLnVtb250cmVhbC5jYS9jb250cmliL3BvL0hUTUwvJywgaW4gdGhlICJOYXRpb25hbCB0ZWFtcyIKK2FyZWEuCiAKLSAgIElmIHlvdSdkIGxpa2UgdG8gdm9sdW50ZWVyIHRvICp3b3JrKiBhdCB0cmFuc2xhdGluZyBtZXNzYWdlcywgeW91CisgICBJZiB5b3UnZCBsaWtlIHRvIHZvbHVudGVlciB0byBfd29ya18gYXQgdHJhbnNsYXRpbmcgbWVzc2FnZXMsIHlvdQogc2hvdWxkIGJlY29tZSBhIG1lbWJlciBvZiB0aGUgdHJhbnNsYXRpbmcgdGVhbSBmb3IgeW91ciBvd24gbGFuZ3VhZ2UuCi1UaGUgc3Vic2NyaWJpbmcgYWRkcmVzcyBpcyAqbm90KiB0aGUgc2FtZSBhcyB0aGUgbGlzdCBpdHNlbGYsIGl0IGhhcworVGhlIHN1YnNjcmliaW5nIGFkZHJlc3MgaXMgX25vdF8gdGhlIHNhbWUgYXMgdGhlIGxpc3QgaXRzZWxmLCBpdCBoYXMKIGAtcmVxdWVzdCcgYXBwZW5kZWQuICBGb3IgZXhhbXBsZSwgc3BlYWtlcnMgb2YgU3dlZGlzaCBjYW4gc2VuZCBhCiBtZXNzYWdlIHRvIGBzdi1yZXF1ZXN0QGxpLm9yZycsIGhhdmluZyB0aGlzIG1lc3NhZ2UgYm9keToKIAogICAgICBzdWJzY3JpYmUKIAogICAgS2VlcCBpbiBtaW5kIHRoYXQgdGVhbSBtZW1iZXJzIGFyZSBleHBlY3RlZCB0byBwYXJ0aWNpcGF0ZQotKmFjdGl2ZWx5KiBpbiB0cmFuc2xhdGlvbnMsIG9yIGF0IHNvbHZpbmcgdHJhbnNsYXRpb25hbCBkaWZmaWN1bHRpZXMsCitfYWN0aXZlbHlfIGluIHRyYW5zbGF0aW9ucywgb3IgYXQgc29sdmluZyB0cmFuc2xhdGlvbmFsIGRpZmZpY3VsdGllcywKIHJhdGhlciB0aGFuIG1lcmVseSBsdXJraW5nIGFyb3VuZC4gIElmIHlvdXIgdGVhbSBkb2VzIG5vdCBleGlzdCB5ZXQgYW5kCiB5b3Ugd2FudCB0byBzdGFydCBvbmUsIG9yIGlmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHdoYXQgdG8gZG8gb3IgaG93IHRvCiBnZXQgc3RhcnRlZCwgcGxlYXNlIHdyaXRlIHRvIGB0cmFuc2xhdGlvbkBpcm8udW1vbnRyZWFsLmNhJyB0byByZWFjaCB0aGUKQEAgLTE3MSw0MyArMTc3LDU1OSBAQAogQXZhaWxhYmxlIFBhY2thZ2VzCiA9PT09PT09PT09PT09PT09PT0KIAotICAgTGFuZ3VhZ2VzIGFyZSBub3QgZXF1YWxseSBzdXBwb3J0ZWQgaW4gYWxsIHBhY2thZ2VzLiAgVGhlIGZvbGxvd2luZwotbWF0cml4IHNob3dzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCBhcyBvZiBBdWd1c3QKLTE5OTcuICBUaGUgbWF0cml4IHNob3dzLCBpbiByZWdhcmQgb2YgZWFjaCBwYWNrYWdlLCBmb3Igd2hpY2ggbGFuZ3VhZ2VzCi1QTyBmaWxlcyBoYXZlIGJlZW4gc3VibWl0dGVkIHRvIHRyYW5zbGF0aW9uIGNvb3JkaW5hdGlvbi4KK0xhbmd1YWdlcyBhcmUgbm90IGVxdWFsbHkgc3VwcG9ydGVkIGluIGFsbCBwYWNrYWdlcy4gIFRoZSBmb2xsb3dpbmcKK21hdHJpeCBzaG93cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBpbnRlcm5hdGlvbmFsaXphdGlvbiwgYXMgb2YgSmFudWFyeQorMjAwNC4gIFRoZSBtYXRyaXggc2hvd3MsIGluIHJlZ2FyZCBvZiBlYWNoIHBhY2thZ2UsIGZvciB3aGljaCBsYW5ndWFnZXMKK1BPIGZpbGVzIGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gdHJhbnNsYXRpb24gY29vcmRpbmF0aW9uLCB3aXRoIGEKK3RyYW5zbGF0aW9uIHBlcmNlbnRhZ2Ugb2YgYXQgbGVhc3QgNTAlLgogCi0gICAgIFJlYWR5IFBPIGZpbGVzICAgIGNzIGRhIGRlIGVuIGVzIGZpIGZyIGl0IGphIGtvIG5sIG5vIHBsIHB0IHNsIHN2Ci0gICAgICAgICAgICAgICAgICAgICAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLSAgICAgYmFzaCAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgfCAgMwotICAgICBiaXNvbiAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8ICAzCi0gICAgIGNsaXNwICAgICAgICAgICB8ICAgICAgIFtdIFtdIFtdICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQKLSAgICAgY3BpbyAgICAgICAgICAgIHwgICAgICAgW10gICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gICAgICAgICAgfCAgNQotICAgICBkaWZmdXRpbHMgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSB8ICA1Ci0gICAgIGVuc2NyaXB0ICAgICAgICB8ICAgICAgIFtdICAgIFtdIFtdIFtdICAgICAgICAgIFtdICAgICAgICAgIFtdICAgIHwgIDYKLSAgICAgZmlsZXV0aWxzICAgICAgIHwgW10gICAgW10gICAgW10gICAgW10gICAgICAgW10gW10gICAgW10gW10gW10gW10gfCAxMAotICAgICBmaW5kdXRpbHMgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSBbXSAgICBbXSBbXSAgICBbXSAgICAgICBbXSB8ICA4Ci0gICAgIGZsZXggICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIHwgIDQKLSAgICAgZ2NhbCAgICAgICAgICAgIHwgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgW10gICAgW10gICAgICAgW10gfCAgNQotICAgICBnZXR0ZXh0ICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSBbXSBbXSBbXSBbXSBbXSB8IDExCi0gICAgIGdyZXAgICAgICAgICAgICB8ICAgICAgIFtdICAgIFtdICAgIFtdICAgICAgIFtdIFtdIFtdIFtdICAgIFtdIFtdIHwgIDkKLSAgICAgaGVsbG8gICAgICAgICAgIHwgICAgICAgW10gICAgW10gICAgW10gICAgICAgW10gW10gW10gW10gW10gW10gW10gfCAxMAotICAgICBpZC11dGlscyAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8ICAzCi0gICAgIGluZGVudCAgICAgICAgICB8ICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgIHwgIDQKLSAgICAgbGliYyAgICAgICAgICAgIHwgICAgICAgW10gICAgW10gICAgW10gICAgICAgW10gW10gICAgW10gICAgICAgW10gfCAgNwotICAgICBtNCAgICAgICAgICAgICAgfCAgICAgICBbXSAgICAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICAgICBbXSB8ICA1Ci0gICAgIG1ha2UgICAgICAgICAgICB8ICAgICAgIFtdICAgIFtdICAgIFtdICAgICAgIFtdIFtdICAgIFtdICAgICAgICAgIHwgIDYKLSAgICAgbXVzaWMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgfCAgMgotICAgICBwdHggICAgICAgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICBbXSBbXSBbXSBbXSAgICBbXSB8ICA4Ci0gICAgIHJlY29kZSAgICAgICAgICB8ICAgIFtdIFtdICAgIFtdICAgIFtdICAgICAgICAgIFtdICAgIFtdIFtdIFtdIFtdIHwgIDkKLSAgICAgc2gtdXRpbHMgICAgICAgIHwgICAgICAgW10gICAgICAgICAgW10gICAgICAgICAgW10gW10gW10gW10gICAgW10gfCAgNwotICAgICBzaGFydXRpbHMgICAgICAgfCAgICAgICBbXSAgICBbXSAgICBbXSAgICAgICAgICBbXSAgICAgICAgICAgICBbXSB8ICA1Ci0gICAgIHRhciAgICAgICAgICAgICB8ICAgICAgIFtdICAgICAgICAgIFtdIFtdICAgIFtdIFtdIFtdIFtdIFtdIFtdIFtdIHwgMTAKLSAgICAgdGV4aW5mbyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMQotICAgICB0ZXh0dXRpbHMgICAgICAgfCBbXSAgICBbXSAgICBbXSAgICBbXSAgICAgICBbXSBbXSBbXSBbXSAgICAgICBbXSB8ICA5Ci0gICAgIHdkaWZmICAgICAgICAgICB8IFtdICAgIFtdICAgIFtdICAgIFtdICAgICAgICAgIFtdIFtdIFtdICAgICAgIFtdIHwgIDgKLSAgICAgICAgICAgICAgICAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotICAgICAgIDE2IGxhbmd1YWdlcyAgICBjcyBkYSBkZSBlbiBlcyBmaSBmciBpdCBqYSBrbyBubCBubyBwbCBwdCBzbCBzdgotICAgICAgIDI3IHBhY2thZ2VzICAgICAgMyAgMiAyNCAgMSAxNyAgMSAyNiAgMiAgMSAxMSAyMCAgOSAxOSAgNyAgNyAxNyAgMTY3CisgICAgIFJlYWR5IFBPIGZpbGVzICAgICAgIGFmIGFtIGFyIGF6IGJlIGJnIGJzIGNhIGNzIGRhIGRlIGVsIGVuIGVuX0dCIGVvIGVzCisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgfAorICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICB8CisgICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgW10gW10gfAorICAgICBiYXRjaGVsb3IgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgW10gfAorICAgICBiaXNvbiAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGJsdWV6LXBpbiAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICBbXSB8CisgICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY29yZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGRhcmtzdGF0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgIFtdICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gW10gICAgICAgICAgW10gW10gfAorICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICBbXSAgICAgICAgIHwKKyAgICAgZXJyb3IgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgIFtdICAgICAgW10gfAorICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAoKSBbXSBbXSBbXSAgICAgICAgICAgICBbXSB8CisgICAgIGZpbGV1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgW10gW10gfAorICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdiaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnY2MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdldHRleHQgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgW10gICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgW10gfAorICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ2ltcC1wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gICAgICAgIFtdICAgICAgW10gfAorICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBnbnVjYXNoICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAoKSAgICAgICAgW10gICAgICBbXSB8CisgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICgpICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ251cGcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgW10gW10gICAgICAgICAgW10gW10gfAorICAgICBncGUtYWVyaWFsICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtY2xvY2sgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtZWRpdCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdGFza21hbmFnZXIgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAoKSAgICAgICAgICAoKSB8CisgICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gfAorICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIGd0aWNrICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaGVsbG8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgW10gW10gfAorICAgICBpZC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGluZGVudCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgICAgICAgICAgW10gICAgW10gW10gW10gW10gW10gW10gW10gICAgICAgICAgW10gW10gfAorICAgICBpc29fMzE2Nl8xICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSBbXSAgICAgICAgICAgICBbXSB8CisgICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzMxNjZfMyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBpc29fNDIxNyAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgW10gfAorICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgW10gfAorICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICB8CisgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gW10gICAgICAgICAgICAgW10gfAorICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpYmljb252ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgICAgICAgICAgICAgICAgfAorICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGluZ290ZWFjaF9sZXNzb25zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgKCkgfAorICAgICBseW54ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSAgICAgICAgICAgICAgICAgICB8CisgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gfAorICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdICAgICAgICAgICAgICAgICgpIHwKKyAgICAgbWluaWNvbSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgW10gfAorICAgICBteXNlY3JldGRpYXJ5ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICgpIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgbmFub18xXzAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gKCkgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBvcGNvZGVzICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgcHR4ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgW10gW10gfAorICAgICBweXRob24gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgW10gW10gW10gICAgICAgICAgW10gW10gfAorICAgICBycG0gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICBzZWQgICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICBbXSAgICBbXSBbXSAgICAgICAgICAgICBbXSBbXSB8CisgICAgIHNoLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBzaGFydXRpbHMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSBbXSBbXSAgICAgICAgICAgICBbXSB8CisgICAgIHNpbGt5ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKCkgICAgICAgICAgICAgICAgW10gfAorICAgICBza2V0Y2ggICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoKSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICB0YXIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBbXSBbXSBbXSAgICAgICAgICAgICAgICBbXSB8CisgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgdGV4dHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICB0aW4gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAgICAgICAgKCkgICAgICAgICB8CisgICAgIHRwLXJvYm90ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gW10gICAgIFtdICAgICAgW10gfAorICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdXRpbC1saW51eCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgd2RpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgICAgICAgW10gfAorICAgICB3Z2V0ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBbXSAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICAgICBbXSB8CisgICAgIHhjaGF0ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgeGZyZWU4Nl94a2JfeG1sICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgfAorICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSB8CisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWYgYW0gYXIgYXogYmUgYmcgYnMgY2EgY3MgZGEgZGUgZWwgZW4gZW5fR0IgZW8gZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIDAgIDAgIDEgIDkgIDQgIDEgNDAgNDEgNjAgNzggMTcgIDEgICA1ICAgMTMgNjgKKyAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGV0IGV1IGZhIGZpIGZyIGdhIGdsIGhlIGhyIGh1IGlkIGlzIGl0IGphIGtvIGxnCisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgYTJwcyAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgfAorICAgICBhZWdpcyAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBhcC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBiYXRjaGVsb3IgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorICAgICBiaXNvbiAgICAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICBbXSAgICAgICAgICB8CisgICAgIGJsdWV6LXBpbiAgICAgICAgICB8ICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBjbGlzcCAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY29yZXV0aWxzICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgfAorICAgICBjcGlvICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICAgICBbXSAgICB8CisgICAgIGRhcmtzdGF0ICAgICAgICAgICB8ICAgICAgICAgICAgICgpIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgW10gW10gICAgW10gW10gICAgICAgW10gICAgICAgfAorICAgICBlMmZzcHJvZ3MgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZXJyb3IgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gW10gICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBmZXRjaG1haWwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICB8CisgICAgIGZpbGV1dGlscyAgICAgICAgICB8IFtdICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgIHwKKyAgICAgZmluZHV0aWxzICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgW10gW10gW10gICAgW10gW10gW10gICAgfAorICAgICBmbGV4ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnYXdrICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICB8CisgICAgIGdiaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnY2MgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdldHRleHQgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIHwKKyAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorICAgICBnZXR0ZXh0LXJ1bnRpbWUgICAgfCAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICB8CisgICAgIGdldHRleHQtdG9vbHMgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgIHwKKyAgICAgZ2ltcC1wcmludCAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgfAorICAgICBnbGl2ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgICAgIFtdICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBnbnVjYXNoICAgICAgICAgICAgfCAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKKyAgICAgZ251cGcgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgW10gICAgICAgICAgW10gICAgW10gW10gICAgICAgfAorICAgICBncGUtYWVyaWFsICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorICAgICBncGUtY2xvY2sgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1jb25mICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtZWRpdCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtb3duZXJpbmZvICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIGdwZS1za2V0Y2hib29rICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdGFza21hbmFnZXIgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGdwZS10aW1lc2hlZXQgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBncGUtdG9kbyAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8CisgICAgIGdwaG90bzIgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgICAgIHwKKyAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgfAorICAgICBncHNkcml2ZSAgICAgICAgICAgfCAgICAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAoKSAoKSAgICAgICB8CisgICAgIGdyYW1hZG9pciAgICAgICAgICB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gW10gW10gW10gW10gICAgW10gW10gICAgICAgfAorICAgICBncmV0bCAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICB8CisgICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgIFtdIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaGVsbG8gICAgICAgICAgICAgIHwgW10gICAgW10gW10gW10gW10gW10gW10gW10gW10gW10gICAgW10gW10gW10gICAgfAorICAgICBpZC11dGlscyAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICBbXSBbXSAgICBbXSAgICAgICAgICB8CisgICAgIGluZGVudCAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgIFtdIFtdICAgICAgIHwKKyAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgICAgW10gICAgICAgW10gW10gICAgICAgW10gW10gW10gICAgW10gICAgICAgICAgfAorICAgICBpc29fMzE2Nl8xICAgICAgICAgfCAgICBbXSAgICAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzMxNjZfMyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBpc29fNDIxNyAgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICB8CisgICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgfAorICAgICBqdGFnICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIFtdICAgIFtdICAgICAgICAgIHwKKyAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBsYXRyaW5lICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgW10gICAgICAgW10gICAgICAgICAgW10gW10gICAgfAorICAgICBsaWJncGV3aWRnZXQgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICB8CisgICAgIGxpYmljb252ICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdIFtdICAgIFtdIFtdIFtdICAgIFtdICAgICAgICAgIHwKKyAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBsaWx5cG9uZCAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgbGluZ290ZWFjaF9sZXNzb25zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBseW54ICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICAgICBbXSBbXSAgICAgICB8CisgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdICAgICAgIFtdICAgICAgIHwKKyAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBtYWtlICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICBbXSBbXSBbXSAgICAgICAgICAgICBbXSBbXSAgICB8CisgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpICgpICAgICAgIHwKKyAgICAgbWluaWNvbSAgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgW10gICAgICAgfAorICAgICBteXNlY3JldGRpYXJ5ICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICB8CisgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIFtdICAgIFtdICAgICAgICAgIHwKKyAgICAgbmFub18xXzAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgW10gICAgW10gICAgICAgICAgfAorICAgICBvcGNvZGVzICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgIFtdICAgICAgICAgICAgICAgICAgIFtdICAgICAgIHwKKyAgICAgcHR4ICAgICAgICAgICAgICAgIHwgW10gICAgICAgW10gW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorICAgICBweXRob24gICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gW10gICAgW10gW10gICAgW10gICAgICAgICAgfAorICAgICBycG0gICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgICB8CisgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBzZWQgICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSBbXSBbXSAgICAgICBbXSBbXSAgICBbXSBbXSAgICAgICB8CisgICAgIHNoLXV0aWxzICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdIFtdICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgIHwKKyAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgICAgICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICBzaGFydXRpbHMgICAgICAgICAgfCBbXSAgICAgICAgICBbXSAgICBbXSAgICAgICBbXSAgICAgICAgICBbXSAgICAgICB8CisgICAgIHNpbGt5ICAgICAgICAgICAgICB8ICAgICAgICAgICgpIFtdICAgICAgICAgICAgICgpICAgICAgICgpICAgICAgICAgIHwKKyAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICBza2V0Y2ggICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHNvdW5kdHJhY2tlciAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIHwKKyAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgfAorICAgICB0YXIgICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSAgICBbXSAgICBbXSBbXSBbXSAgICBbXSBbXSAgICAgICB8CisgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgIFtdICAgICAgIHwKKyAgICAgdGV4dHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgW10gW10gW10gICAgICAgW10gICAgICAgICAgW10gW10gICAgfAorICAgICB0aW4gICAgICAgICAgICAgICAgfCBbXSAgICAgICAgICAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHRwLXJvYm90ICAgICAgICAgICB8ICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgICAgICAgICAgW10gW10gICAgICAgW10gICAgW10gW10gW10gW10gW10gW10gICAgfAorICAgICB1bmljb2RlLWhhbi10cmEuLi4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdXRpbC1saW51eCAgICAgICAgIHwgW10gICAgICAgW10gW10gICAgICAgICAgICAgW10gICAgICAgKCkgW10gICAgICAgfAorICAgICB2b3JiaXMtdG9vbHMgICAgICAgfCAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgd2RpZmYgICAgICAgICAgICAgIHwgW10gICAgICAgICAgW10gW10gW10gICAgICAgW10gW10gICAgICAgICAgICAgICAgfAorICAgICB3Z2V0ICAgICAgICAgICAgICAgfCBbXSAgICAgICBbXSBbXSAgICBbXSAgICBbXSBbXSAgICAgICAgICBbXSAgICAgICB8CisgICAgIHhjaGF0ICAgICAgICAgICAgICB8IFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgeGZyZWU4Nl94a2JfeG1sICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgfAorICAgICB4cGFkICAgICAgICAgICAgICAgfCAgICAgICAgICAgICBbXSBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXQgZXUgZmEgZmkgZnIgZ2EgZ2wgaGUgaHIgaHUgaWQgaXMgaXQgamEga28gbGcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjIgIDIgIDEgMjYgMTA2IDI4IDI0ICA4IDEwIDQxIDMzICAxIDI2IDMzIDEyICAwCisgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBsdCBsdiBtayBtbiBtcyBtdCBuYiBubCBubiBubyBuc28gcGwgcHQgcHRfQlIgcm8gcnUKKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgYTJwcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgKCkgICAgICgpICAgICBbXSAgIFtdIFtdIHwKKyAgICAgYWVnaXMgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgICgpICgpIHwKKyAgICAgYW50LXBob25lICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgYW51YmlzICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gW10gICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgYXAtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICgpICAgICAgICAgIFtdICAgIHwKKyAgICAgYXNwZWxsICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgYmFzaCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgIFtdIFtdIHwKKyAgICAgYmF0Y2hlbG9yICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgYmZkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgYmludXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgYmlzb24gICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdIFtdIHwKKyAgICAgYmx1ZXotcGluICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgICAgIFtdICAgIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY2xpc3AgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgY29uc29sZS10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgY29yZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgY3BpbyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgZGFya3N0YXQgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdICAgIHwKKyAgICAgZGlmZnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgZTJmc3Byb2dzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgIHwKKyAgICAgZW5zY3JpcHQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdIFtdIHwKKyAgICAgZXJyb3IgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdICAgIHwKKyAgICAgZmV0Y2htYWlsICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAoKSAgICAgIFtdIHwKKyAgICAgZmlsZXV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgZmluZHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgZmxleCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgZnNsaW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgZ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2F3ayAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdICAgIHwKKyAgICAgZ2JpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgZ2NhbCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2NjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2V0dGV4dCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgZ2V0dGV4dC1leGFtcGxlcyAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgICAgIFtdICAgIHwKKyAgICAgZ2V0dGV4dC1ydW50aW1lICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgZ2V0dGV4dC10b29scyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdICAgIHwKKyAgICAgZ2ltcC1wcmludCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ2xpdiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdICAgIHwKKyAgICAgZ2x1bmFyY2xvY2sgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgZ251YmlmZiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ251Y2FzaCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAoKSAgICAgIFtdIHwKKyAgICAgZ251Y2FzaC1nbG9zc2FyeSAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgICAgICAgIHwKKyAgICAgZ251cGcgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgZ3BlLWFlcmlhbCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWJlYW0gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWNhbGVuZGFyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWNsb2NrICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWNvbmYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWNvbnRhY3RzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWVkaXQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWdvICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLWxvZ2luICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLW93bmVyaW5mbyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLXNrZXRjaGJvb2sgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLXN1ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLXRhc2ttYW5hZ2VyICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLXRpbWVzaGVldCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLXRvZGF5ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3BlLXRvZG8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdIFtdIHwKKyAgICAgZ3Bob3RvMiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgZ3Byb2YgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAgIFtdICAgIHwKKyAgICAgZ3BzZHJpdmUgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgZ3JhbWFkb2lyICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgZ3JlcCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICBbXSAgIFtdIFtdIHwKKyAgICAgZ3JldGwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgZ3RpY2sgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgaGVsbG8gICAgICAgICAgICAgIHwgICAgW10gICAgICAgW10gICAgW10gW10gW10gW10gICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgaWQtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdIFtdIHwKKyAgICAgaW5kZW50ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdIFtdIHwKKyAgICAgaXNvXzMxNjYgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzMxNjZfMSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzMxNjZfMiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzMxNjZfMyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgaXNvXzQyMTcgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgW10gW10gW10gICAgIFtdIFtdICBbXSAgICAgIFtdIHwKKyAgICAgaXNvXzYzOSAgICAgICAgICAgIHwgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAganBpbG90ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAganRhZyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgandob2lzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgIFtdICgpIHwKKyAgICAga2JkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICAgICAgIFtdICAgIHwKKyAgICAgbGF0cmluZSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgbGQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGliYyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgW10gICAgIFtdICAgICBbXSAgICAgICAgIHwKKyAgICAgbGliZ3Bld2lkZ2V0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgIFtdICAgIHwKKyAgICAgbGliaWNvbnYgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgbGlmZWxpbmVzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGlseXBvbmQgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGluZ290ZWFjaCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbGluZ290ZWFjaF9sZXNzb25zIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgbHlueCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgIFtdIHwKKyAgICAgbTQgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgbWFpbHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgbWFrZSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgIFtdICAgICBbXSAgICAgIFtdIHwKKyAgICAgbWFuLWRiICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgbWluaWNvbSAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgbXlzZWNyZXRkaWFyeSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgIFtdICAgIHwKKyAgICAgbmFubyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgW10gICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgbmFub18xXzAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgW10gICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgb3Bjb2RlcyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgcGFydGVkICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgIFtdIFtdICBbXSAgICAgICAgIHwKKyAgICAgcHR4ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gW10gICAgW10gICAgIFtdIFtdICBbXSAgIFtdIFtdIHwKKyAgICAgcHl0aG9uICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgcmFkaXVzICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgIFtdIHwKKyAgICAgcmVjb2RlICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgcnBtICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgIFtdIHwKKyAgICAgc2NyZWVtICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2Nyb2xsa2VlcGVyICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgc2VkICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdICAgIHwKKyAgICAgc2gtdXRpbHMgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgc2hhcmVkLW1pbWUtaW5mbyAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gW10gICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc2hhcnV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgc2lsa3kgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIHwKKyAgICAgc2tlbmNpbCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgIHwKKyAgICAgc2tldGNoICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICBbXSAgICAgICAgIHwKKyAgICAgc291bmR0cmFja2VyICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgc3AgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdGFyICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgW10gICAgICAgW10gICAgIFtdICAgICBbXSAgIFtdICAgIHwKKyAgICAgdGV4aW5mbyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgdGV4dHV0aWxzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgdGluICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdHAtcm9ib3QgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdHV4cGFpbnQgICAgICAgICAgIHwgW10gICAgICAgICAgW10gICAgICAgW10gW10gICAgICAgIFtdIFtdICBbXSAgIFtdICAgIHwKKyAgICAgdW5pY29kZS1oYW4tdHJhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdW5pY29kZS10cmFuc2xhLi4uIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgdXRpbC1saW51eCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICBbXSAgICAgIFtdIHwKKyAgICAgdm9yYmlzLXRvb2xzICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdIFtdIHwKKyAgICAgd2FzdGVzZWRnZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgd2RpZmYgICAgICAgICAgICAgIHwgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgIFtdICAgICBbXSAgIFtdIFtdIHwKKyAgICAgd2dldCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgIFtdIFtdIHwKKyAgICAgeGNoYXQgICAgICAgICAgICAgIHwgICAgW10gICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgeGZyZWU4Nl94a2JfeG1sICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgIFtdIHwKKyAgICAgeHBhZCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICAgICAgICAgICAgIFtdICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbHQgbHYgbWsgbW4gbXMgbXQgbmIgbmwgbm4gbm8gbnNvIHBsIHB0IHB0X0JSIHJvIHJ1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAyICAwICAzIDEyICAwIDEwIDY5ICA2ICA3ICAxICA0MCAyNiAgMzYgICA3NiA2MworICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2sgc2wgc3Igc3YgdGEgdGggdHIgdWsgdmVuIHZpIHdhIHhoIHpoX0NOIHpoX1RXIHp1CisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgIGEycHMgICAgICAgICAgICAgICB8ICAgIFtdICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgICAgIGFlZ2lzICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisgICAgIGFudC1waG9uZSAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGFudWJpcyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisgICAgIGFwLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGFzcGVsbCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisgICAgIGJhc2ggICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisgICAgIGJhdGNoZWxvciAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGJmZCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2CisgICAgIGJpbnV0aWxzICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8ICA4CisgICAgIGJpc29uICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0CisgICAgIGJsdWV6LXBpbiAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8IDE0CisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisgICAgIGNsaXNwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgIGNvbnNvbGUtdG9vbHMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGNvcmV1dGlscyAgICAgICAgICB8ICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE2CisgICAgIGNwaW8gICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE0CisgICAgIGRhcmtzdGF0ICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgKCkgICAgICB8IDEyCisgICAgIGRpZmZ1dGlscyAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDIzCisgICAgIGUyZnNwcm9ncyAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2CisgICAgIGVuc2NyaXB0ICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCisgICAgIGVycm9yICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE1CisgICAgIGZldGNobWFpbCAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCisgICAgIGZpbGV1dGlscyAgICAgICAgICB8ICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgW10gICAgICB8IDE3CisgICAgIGZpbmR1dGlscyAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDI5CisgICAgIGZsZXggICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEzCisgICAgIGZzbGludCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGdhd2sgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCisgICAgIGdiaWZmICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisgICAgIGdjYWwgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisgICAgIGdjYyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisgICAgIGdldHRleHQgICAgICAgICAgICB8IFtdIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE2CisgICAgIGdldHRleHQtZXhhbXBsZXMgICB8IFtdICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE0CisgICAgIGdldHRleHQtcnVudGltZSAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgW10gICAgW10gICAgICB8IDIyCisgICAgIGdldHRleHQtdG9vbHMgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE0CisgICAgIGdpbXAtcHJpbnQgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCisgICAgIGdsaXYgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGdsdW5hcmNsb2NrICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8IDEzCisgICAgIGdudWJpZmYgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGdudWNhc2ggICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8ICA5CisgICAgIGdudWNhc2gtZ2xvc3NhcnkgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8ICA4CisgICAgIGdudXBnICAgICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE3CisgICAgIGdwZS1hZXJpYWwgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisgICAgIGdwZS1iZWFtICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4CisgICAgIGdwZS1jYWxlbmRhciAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICB8IDEzCisgICAgIGdwZS1jbG9jayAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCisgICAgIGdwZS1jb25mICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisgICAgIGdwZS1jb250YWN0cyAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDExCisgICAgIGdwZS1lZGl0ICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICB8IDEyCisgICAgIGdwZS1nbyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgIGdwZS1sb2dpbiAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICB8IDEzCisgICAgIGdwZS1vd25lcmluZm8gICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDEzCisgICAgIGdwZS1za2V0Y2hib29rICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisgICAgIGdwZS1zdSAgICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCisgICAgIGdwZS10YXNrbWFuYWdlciAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCisgICAgIGdwZS10aW1lc2hlZXQgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDEyCisgICAgIGdwZS10b2RheSAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICB8IDEzCisgICAgIGdwZS10b2RvICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgW10gICAgICB8IDEyCisgICAgIGdwaG90bzIgICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDExCisgICAgIGdwcm9mICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisgICAgIGdwc2RyaXZlICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGdyYW1hZG9pciAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgIGdyZXAgICAgICAgICAgICAgICB8ICAgIFtdIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI2CisgICAgIGdyZXRsICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGd0aWNrICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisgICAgIGhlbGxvICAgICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM0CisgICAgIGlkLXV0aWxzICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCisgICAgIGluZGVudCAgICAgICAgICAgICB8IFtdICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIxCisgICAgIGlzb18zMTY2ICAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdICAgIFtdICAgICBbXSAgICAgICAgICAgICAgICAgICB8IDI3CisgICAgIGlzb18zMTY2XzEgICAgICAgICB8IFtdIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgICAgIGlzb18zMTY2XzIgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisgICAgIGlzb18zMTY2XzMgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIGlzb180MjE3ICAgICAgICAgICB8IFtdIFtdICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDI0CisgICAgIGlzb182MzkgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCisgICAgIGpwaWxvdCAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICBbXSAgICAgICAgW10gICAgW10gICAgICB8ICA5CisgICAgIGp0YWcgICAgICAgICAgICAgICB8IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIGp3aG9pcyAgICAgICAgICAgICB8ICAgICAgICAgICgpICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDExCisgICAgIGtiZCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCisgICAgIGxhdHJpbmUgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIGxkICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgIGxpYmMgICAgICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDIwCisgICAgIGxpYmdwZXdpZGdldCAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICBbXSAgICAgICAgICAgICAgICAgICB8IDEzCisgICAgIGxpYmljb252ICAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgICAgICBbXSAgICAgW10gICAgICAgICAgICB8IDI3CisgICAgIGxpZmVsaW5lcyAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIGxpbHlwb25kICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIGxpbmdvdGVhY2ggICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIGxpbmdvdGVhY2hfbGVzc29ucyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgICAgICAgICAgICB8ICAwCisgICAgIGx5bnggICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0CisgICAgIG00ICAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE1CisgICAgIG1haWx1dGlscyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgIG1ha2UgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE2CisgICAgIG1hbi1kYiAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgIG1pbmljb20gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDExCisgICAgIG15c2VjcmV0ZGlhcnkgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwCisgICAgIG5hbm8gICAgICAgICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE3CisgICAgIG5hbm9fMV8wICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE3CisgICAgIG9wY29kZXMgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2CisgICAgIHBhcnRlZCAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE1CisgICAgIHB0eCAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIyCisgICAgIHB5dGhvbiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisgICAgIHJhZGl1cyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0CisgICAgIHJlY29kZSAgICAgICAgICAgICB8ICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIwCisgICAgIHJwbSAgICAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA5CisgICAgIHNjcmVlbSAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8ICAyCisgICAgIHNjcm9sbGtlZXBlciAgICAgICB8IFtdICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1CisgICAgIHNlZCAgICAgICAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0CisgICAgIHNoLXV0aWxzICAgICAgICAgICB8ICAgIFtdICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE0CisgICAgIHNoYXJlZC1taW1lLWluZm8gICB8ICAgICAgIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisgICAgIHNoYXJ1dGlscyAgICAgICAgICB8ICAgICAgIFtdIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE3CisgICAgIHNpbGt5ICAgICAgICAgICAgICB8ICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIHNrZW5jaWwgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2CisgICAgIHNrZXRjaCAgICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2CisgICAgIHNvdW5kdHJhY2tlciAgICAgICB8IFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA3CisgICAgIHNwICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAzCisgICAgIHRhciAgICAgICAgICAgICAgICB8IFtdIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDI0CisgICAgIHRleGluZm8gICAgICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE0CisgICAgIHRleHR1dGlscyAgICAgICAgICB8ICAgIFtdICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICB8IDE2CisgICAgIHRpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxCisgICAgIHRwLXJvYm90ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIHR1eHBhaW50ICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICBbXSAgICAgW10gICAgICAgICAgICB8IDI5CisgICAgIHVuaWNvZGUtaGFuLXRyYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisgICAgIHVuaWNvZGUtdHJhbnNsYS4uLiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyCisgICAgIHV0aWwtbGludXggICAgICAgICB8ICAgICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1CisgICAgIHZvcmJpcy10b29scyAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4CisgICAgIHdhc3Rlc2VkZ2UgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAwCisgICAgIHdkaWZmICAgICAgICAgICAgICB8IFtdICAgICAgIFtdICAgICAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE4CisgICAgIHdnZXQgICAgICAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgIFtdIFtdICAgICAgICAgICAgICAgW10gICAgW10gICAgICB8IDI0CisgICAgIHhjaGF0ICAgICAgICAgICAgICB8IFtdIFtdIFtdIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDE1CisgICAgIHhmcmVlODZfeGtiX3htbCAgICB8IFtdICAgIFtdICAgICAgICAgIFtdIFtdICAgICAgICAgICAgICAgW10gICAgICAgICAgICB8IDExCisgICAgIHhwYWQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1CisgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgNjMgdGVhbXMgICAgICAgICAgIHNrIHNsIHNyIHN2IHRhIHRoIHRyIHVrIHZlbiB2aSB3YSB4aCB6aF9DTiB6aF9UVyB6dQorICAgICAgMTMxIGRvbWFpbnMgICAgICAgICA0NyAxOSAyOCA4MyAgMCAgMCA1OSAxMyAgMSAgIDEgMTEgIDAgIDIyICAgIDIyICAgIDAgIDEzNzMKIAogICAgU29tZSBjb3VudGVycyBpbiB0aGUgcHJlY2VkaW5nIG1hdHJpeCBhcmUgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZgogdmlzaWJsZSBibG9ja3MgbGV0IHVzIGV4cGVjdC4gIFRoaXMgaXMgYmVjYXVzZSBhIGZldyBleHRyYSBQTyBmaWxlcyBhcmUKQEAgLTIyMCw2ICs3NDIsMjcgQEAKIGxhZyBiZXR3ZWVuIHRoZSBtZXJlIGV4aXN0ZW5jZSBhIFBPIGZpbGUgYW5kIGl0cyB3aWRlIGF2YWlsYWJpbGl0eSBpbiBhCiBkaXN0cmlidXRpb24uCiAKLSAgIElmIEF1Z3VzdCAxOTk3IHNlZW1zIHRvIGJlIG9sZCwgeW91IG1heSBmZXRjaCBhIG1vcmUgcmVjZW50IGNvcHkgb2YKLXRoaXMgYEFCT1VULU5MUycgZmlsZSBvbiBtb3N0IEdOVSBhcmNoaXZlIHNpdGVzLgorICAgSWYgSmFudWFyeSAyMDA0IHNlZW1zIHRvIGJlIG9sZCwgeW91IG1heSBmZXRjaCBhIG1vcmUgcmVjZW50IGNvcHkgb2YKK3RoaXMgYEFCT1VULU5MUycgZmlsZSBvbiBtb3N0IEdOVSBhcmNoaXZlIHNpdGVzLiAgVGhlIG1vc3QgdXAtdG8tZGF0ZQorbWF0cml4IHdpdGggZnVsbCBwZXJjZW50YWdlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGF0CitgaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL2NvbnRyaWIvcG8vSFRNTC9tYXRyaXguaHRtbCcuCisKK1VzaW5nIGBnZXR0ZXh0JyBpbiBuZXcgcGFja2FnZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSWYgeW91IGFyZSB3cml0aW5nIGEgZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtIGFuZCB3YW50IHRvCitpbnRlcm5hdGlvbmFsaXplIGl0IHlvdSBhcmUgd2VsY29tZSB0byB1c2UgR05VIGBnZXR0ZXh0JyBpbiB5b3VyCitwYWNrYWdlLiAgT2YgY291cnNlIHlvdSBoYXZlIHRvIHJlc3BlY3QgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitMaWNlbnNlIHdoaWNoIGNvdmVycyB0aGUgdXNlIG9mIHRoZSBHTlUgYGdldHRleHQnIGxpYnJhcnkuICBUaGlzIG1lYW5zCitpbiBwYXJ0aWN1bGFyIHRoYXQgZXZlbiBub24tZnJlZSBwcm9ncmFtcyBjYW4gdXNlIGBsaWJpbnRsJyBhcyBhIHNoYXJlZAorbGlicmFyeSwgd2hlcmVhcyBvbmx5IGZyZWUgc29mdHdhcmUgY2FuIHVzZSBgbGliaW50bCcgYXMgYSBzdGF0aWMKK2xpYnJhcnkgb3IgdXNlIG1vZGlmaWVkIHZlcnNpb25zIG9mIGBsaWJpbnRsJy4KKworICAgT25jZSB0aGUgc291cmNlcyBhcmUgY2hhbmdlZCBhcHByb3ByaWF0ZWx5IGFuZCB0aGUgc2V0dXAgY2FuIGhhbmRsZQordGhlIHVzZSBvZiBgZ2V0dGV4dCcgdGhlIG9ubHkgdGhpbmcgbWlzc2luZyBhcmUgdGhlIHRyYW5zbGF0aW9ucy4gIFRoZQorRnJlZSBUcmFuc2xhdGlvbiBQcm9qZWN0IGlzIGFsc28gYXZhaWxhYmxlIGZvciBwYWNrYWdlcyB3aGljaCBhcmUgbm90CitkZXZlbG9wZWQgaW5zaWRlIHRoZSBHTlUgcHJvamVjdC4gIFRoZXJlZm9yZSB0aGUgaW5mb3JtYXRpb24gZ2l2ZW4gYWJvdmUKK2FwcGxpZXMgYWxzbyBmb3IgZXZlcnkgb3RoZXIgRnJlZSBTb2Z0d2FyZSBQcm9qZWN0LiAgQ29udGFjdAorYHRyYW5zbGF0aW9uQGlyby51bW9udHJlYWwuY2EnIHRvIG1ha2UgdGhlIGAucG90JyBmaWxlcyBhdmFpbGFibGUgdG8KK3RoZSB0cmFuc2xhdGlvbiB0ZWFtcy4KIAotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL0NoYW5nZUxvZwkxOTk4LTEyLTI5IDE3OjQ5OjU2LjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9DaGFuZ2VMb2cJMjAwNC0wOS0xMiAxNDo0MDozNS44NDY1MjE0NTYgLTA0MDAKQEAgLTEsMyArMSwxMSBAQAorMjAwNC0wOS0xMiAgZ2V0dGV4dGl6ZSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgorCisJKiBNYWtlZmlsZS5hbSAoQUNMT0NBTF9BTUZMQUdTKTogTmV3IHZhcmlhYmxlLgorCShFWFRSQV9ESVNUKTogQWRkIGNvbmZpZy5ycGF0aC4KKwkqIGNvbmZpZ3VyZS5pbiAoQUNfT1VUUFVUKTogQWRkIG00L01ha2VmaWxlLgorCShBQ19PVVRQVVQpOiBSZW1vdmUgY29tbWFuZCB0aGF0IGNyZWF0ZWQgcG8vTWFrZWZpbGUuCisJKEFDX0xJTktfRklMRVMpOiBSZW1vdmUgaW52b2NhdGlvbi4KKwogMTk5OC0xMi0yOQlVd2UgT2hzZSAgPHV3ZUBvaHNlLmRlPgogCiAJKiBzcmMvbHJ6LmM6IHJlbW92ZWQgc3RwY3B5IGNhbGwuCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvY29uZmlnLnJwYXRoCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2NvbmZpZy5ycGF0aAkyMDA0LTA5LTEyIDE0OjQwOjM0LjMyOTc1MjA0MCAtMDQwMApAQCAtMCwwICsxLDU0OCBAQAorIyEgL2Jpbi9zaAorIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHNldCBvZiB2YXJpYWJsZXMsIGRlc2NyaWJpbmcgaG93IHRvIHNldCB0aGUKKyMgcnVuIHRpbWUgc2VhcmNoIHBhdGggb2Ygc2hhcmVkIGxpYnJhcmllcyBpbiBhbiBleGVjdXRhYmxlLgorIworIyAgIENvcHlyaWdodCAxOTk2LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgVGFrZW4gZnJvbSBHTlUgbGlidG9vbCwgMjAwMQorIyAgIE9yaWdpbmFsbHkgYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgICBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgICBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyAgIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgVGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIGZpbGUgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHNwZWNpZmljYXRpb24sCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIENDLCBHQ0MsIExERkxBR1MsIExELCB3aXRoX2dudV9sZAorIyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIuCisjCisjIFRoZSBzZXQgb2YgZGVmaW5lZCB2YXJpYWJsZXMgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIHNjcmlwdC4KKworIyBLbm93biBsaW1pdGF0aW9uczoKKyMgLSBPbiBJUklYIDYuNSB3aXRoIENDPSJjYyIsIHRoZSBydW4gdGltZSBzZWFyY2ggcGF0Y2ggbXVzdCBub3QgYmUgbG9uZ2VyCisjICAgdGhhbiAyNTYgYnl0ZXMsIG90aGVyd2lzZSB0aGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgZHVtcCBjb3JlLiBUaGUgb25seQorIyAgIGtub3duIHdvcmthcm91bmQgaXMgdG8gY2hvb3NlIHNob3J0ZXIgZGlyZWN0b3J5IG5hbWVzIGZvciB0aGUgYnVpbGQKKyMgICBkaXJlY3RvcnkgYW5kL29yIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nIChleGNlcHQgTSRWQywKKyMgd2hpY2ggbmVlZHMgJy5saWInKS4KK2xpYmV4dD1hCitzaHJleHQ9LnNvCisKK2hvc3Q9IiQxIgoraG9zdF9jcHU9YGVjaG8gIiRob3N0IiB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCitob3N0X3ZlbmRvcj1gZWNobyAiJGhvc3QiIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKK2hvc3Rfb3M9YGVjaG8gIiRob3N0IiB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKKyMgQ29kZSB0YWtlbiBmcm9tIGxpYnRvb2wubTQncyBBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDLgorCit3bD0KK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHdsPSctV2wsJworZWxzZQorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBhaXgqKQorICAgICAgd2w9Jy1XbCwnCisgICAgICA7OworICAgIG1pbmd3KiB8IHB3MzIqIHwgb3MyKikKKyAgICAgIDs7CisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBuZXdzb3M2KQorICAgICAgOzsKKyAgICBsaW51eCopCisgICAgICBjYXNlICRDQyBpbgorICAgICAgICBpY2N8ZWNjKQorICAgICAgICAgIHdsPSctV2wsJworICAgICAgICAgIDs7CisgICAgICAgIGNjYykKKyAgICAgICAgICB3bD0nLVdsLCcKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICB3bD0nLVdsLCcKKyAgICAgIDs7CisgICAgc2NvMy4ydjUqKQorICAgICAgOzsKKyAgICBzb2xhcmlzKikKKyAgICAgIHdsPSctV2wsJworICAgICAgOzsKKyAgICBzdW5vczQqKQorICAgICAgd2w9Jy1Rb3B0aW9uIGxkICcKKyAgICAgIDs7CisgICAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICAgICAgd2w9Jy1XbCwnCisgICAgICA7OworICAgIHN5c3Y0Kk1QKikKKyAgICAgIDs7CisgICAgdXRzNCopCisgICAgICA7OworICBlc2FjCitmaQorCisjIENvZGUgdGFrZW4gZnJvbSBsaWJ0b29sLm00J3MgQUNfTElCVE9PTF9QUk9HX0xEX1NITElCUy4KKworaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0KK2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CitoYXJkY29kZV9kaXJlY3Q9bm8KK2hhcmRjb2RlX21pbnVzX0w9bm8KKworY2FzZSAiJGhvc3Rfb3MiIGluCisgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKikKKyAgICAjIEZJWE1FOiB0aGUgTVNWQysrIHBvcnQgaGFzbid0IGJlZW4gdGVzdGVkIGluIGEgbG9vb29uZyB0aW1lCisgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICBmaQorICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKK2VzYWMKKworbGRfc2hsaWJzPXllcworaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICBhaXgzKiB8IGFpeDQqIHwgYWl4NSopCisgICAgICAjIE9uIEFJWC9QUEMsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBhbWlnYW9zKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAjIFNhbXVlbCBBLiBGYWx2byBJSSA8a2M1dGphQGRvbHBoaW4ub3BlbnByb2plY3RzLm5ldD4gcmVwb3J0cworICAgICAgIyB0aGF0IHRoZSBzZW1hbnRpY3Mgb2YgZHluYW1pYyBsaWJyYXJpZXMgb24gQW1pZ2FPUywgYXQgbGVhc3QgdXAKKyAgICAgICMgdG8gdmVyc2lvbiA0LCBpcyB0byBzaGFyZSBkYXRhIGFtb25nIG11bHRpcGxlIHByb2dyYW1zIGxpbmtlZAorICAgICAgIyB3aXRoIHRoZSBzYW1lIGR5bmFtaWMgbGlicmFyeS4gIFNpbmNlIHRoaXMgZG9lc24ndCBtYXRjaCB0aGUKKyAgICAgICMgYmVoYXZpb3Igb2Ygc2hhcmVkIGxpYnJhcmllcyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGNhbiB1c2UKKyAgICAgICMgdGhlbS4KKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgICBiZW9zKikKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICA6CisgICAgICBlbHNlCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGdyZXAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICA6CisgICAgICBlbHNlCisgICAgICAgIGxkX3NobGlicz1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgbmV0YnNkKikKKyAgICAgIDs7CisgICAgc29sYXJpcyogfCBzeXN2NSopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8IGdyZXAgJ0JGRCAyXC44JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBsZF9zaGxpYnM9bm8KKyAgICAgIGVsaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgICBzdW5vczQqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgOzsKKyAgICAqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIDoKKyAgICAgIGVsc2UKKyAgICAgICAgbGRfc2hsaWJzPW5vCisgICAgICBmaQorICAgICAgOzsKKyAgZXNhYworICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IHllczsgdGhlbgorICAgICMgVW5saWtlIGxpYnRvb2wsIHdlIHVzZSAtcnBhdGggaGVyZSwgbm90IC0tcnBhdGgsIHNpbmNlIHRoZSBkb2N1bWVudGVkCisgICAgIyBvcHRpb24gb2YgR05VIGxkIGlzIGNhbGxlZCAtcnBhdGgsIG5vdCAtLXJwYXRoLgorICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgZmkKK2Vsc2UKKyAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgYWl4MyopCisgICAgICAjIE5vdGU6IHRoaXMgbGlua2VyIGhhcmRjb2RlcyB0aGUgZGlyZWN0b3JpZXMgaW4gTElCUEFUSCBpZiB0aGVyZQorICAgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorICAgICAgICAjIGJyb2tlbiBjb2xsZWN0Mi4KKyAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKyAgICBhaXg0KiB8IGFpeDUqKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgICAjIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgZWxzZQorICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPW5vCisgICAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgICAjIEFJWCBzdHlsZSBsaW5raW5nLiBJZiAtYnJ0bCBpcyBzb21ld2hlcmUgaW4gTERGTEFHUywgd2UKKyAgICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKyAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlsyM118YWl4NC5bMjNdLip8YWl4NSopCisgICAgICAgICAgZm9yIGxkX2ZsYWcgaW4gJExERkxBR1M7IGRvCisgICAgICAgICAgICBpZiAodGVzdCAkbGRfZmxhZyA9ICItYnJ0bCIgfHwgdGVzdCAkbGRfZmxhZyA9ICItV2wsLWJydGwiKTsgdGhlbgorICAgICAgICAgICAgICBhaXhfdXNlX3J1bnRpbWVsaW5raW5nPXllcworICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgIGVzYWMKKyAgICAgIGZpCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSc6JworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LlswMTJdfGFpeDQuWzAxMl0uKikKKyAgICAgICAgICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisgICAgICAgICAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYgXAorICAgICAgICAgICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCBncmVwIHJlc29sdmVfbGliX25hbWUgPi9kZXYvbnVsbAorICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAorICAgICAgICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9CisgICAgICAgICAgZmkKKyAgICAgICAgZXNhYworICAgICAgZmkKKyAgICAgICMgQmVnaW4gX0xUX0FDX1NZU19MSUJQQVRIX0FJWC4KKyAgICAgIGVjaG8gJ2ludCBtYWluICgpIHsgcmV0dXJuIDA7IH0nID4gY29uZnRlc3QuYworICAgICAgJHtDQ30gJHtMREZMQUdTfSBjb25mdGVzdC5jIC1vIGNvbmZ0ZXN0CisgICAgICBhaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCAyPi9kZXYvbnVsbCB8IHNlZCAtbiAtZSAnL0ltcG9ydCBGaWxlIFN0cmluZ3MvLC9eJC8geyAvXjAvIHsgcy9eMCAgKlwoLipcKSQvXDEvOyBwOyB9Cit9J2AKKyAgICAgIGlmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KKyAgICAgICAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QgMj4vZGV2L251bGwgfCBzZWQgLW4gLWUgJy9JbXBvcnQgRmlsZSBTdHJpbmdzLywvXiQvIHsgL14wLyB7IHMvXjAgICpcKC4qXCkkL1wxLzsgcDsgfQorfSdgCisgICAgICBmaQorICAgICAgaWYgdGVzdCAteiAiJGFpeF9saWJwYXRoIjsgdGhlbgorICAgICAgICBhaXhfbGlicGF0aD0iL3Vzci9saWI6L2xpYiIKKyAgICAgIGZpCisgICAgICBybSAtZiBjb25mdGVzdC5jIGNvbmZ0ZXN0CisgICAgICAjIEVuZCBfTFRfQUNfU1lTX0xJQlBBVEhfQUlYLgorICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisgICAgICBlbHNlCisgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisgICAgICAgIGVsc2UKKyAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorICAgICAgICBmaQorICAgICAgZmkKKyAgICAgIDs7CisgICAgYW1pZ2FvcyopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIHRoZSBHTlUgbGQgc2VjdGlvbgorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICAgIGJzZGk0KikKKyAgICAgIDs7CisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqKQorICAgICAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKKyAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBDKysuCisgICAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCisgICAgICAjIG5vIHNlYXJjaCBwYXRoIGZvciBETExzLgorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nICcKKyAgICAgIGxpYmV4dD1saWIKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgIGlmICRDQyAtdiAyPiYxIHwgZ3JlcCAnQXBwbGUnID4vZGV2L251bGwgOyB0aGVuCisgICAgICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZGd1eCopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICA7OworICAgIGZyZWVic2QxKikKKyAgICAgIGxkX3NobGlicz1ubworICAgICAgOzsKKyAgICBmcmVlYnNkMi4yKikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIDs7CisgICAgZnJlZWJzZDIqKQorICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIDs7CisgICAgZnJlZWJzZCopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICA7OworICAgIGhwdXg5KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgOzsKKyAgICBocHV4MTAqIHwgaHB1eDExKikKKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorICAgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICAgICAgaHBwYSo2NCopCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgorICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICAgICAgICA7OworICAgICAgICAgIGlhNjQqKQorICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICAgICAgICAjIGhhcmRjb2RlX21pbnVzX0w6IE5vdCByZWFsbHkgaW4gdGhlIHNlYXJjaCBQQVRILAorICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgICAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgICAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgOzsKKyAgICBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworICAgIG5ldGJzZCopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICA7OworICAgIG5ld3NvczYpCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisgICAgb3BlbmJzZCopCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKyAgICAgIGVsc2UKKyAgICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICAgICAgb3BlbmJzZFswMV0uKiB8IG9wZW5ic2QyLlswLTddIHwgb3BlbmJzZDIuWzAtN10uKikKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKikKKyAgICAgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorICAgICAgOzsKKyAgICBvczIqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIDs7CisgICAgb3NmMyopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKKyAgICAgIDs7CisgICAgb3NmNCogfCBvc2Y1KikKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKyAgICAgICAgIyBCb3RoIGNjIGFuZCBjeHggY29tcGlsZXIgc3VwcG9ydCAtcnBhdGggZGlyZWN0bHkKKyAgICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLXJwYXRoICRsaWJkaXInCisgICAgICBmaQorICAgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgICA7OworICAgIHNjbzMuMnY1KikKKyAgICAgIDs7CisgICAgc29sYXJpcyopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgICA7OworICAgIHN1bm9zNCopCisgICAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgICBoYXJkY29kZV9taW51c19MPXllcworICAgICAgOzsKKyAgICBzeXN2NCkKKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgICAgICAgIHNuaSkKKyAgICAgICAgICBoYXJkY29kZV9kaXJlY3Q9eWVzICMgaXMgdGhpcyByZWFsbHkgdHJ1ZT8/PworICAgICAgICAgIDs7CisgICAgICAgIHNpZW1lbnMpCisgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vCisgICAgICAgICAgOzsKKyAgICAgICAgbW90b3JvbGEpCisgICAgICAgICAgaGFyZGNvZGVfZGlyZWN0PW5vICNNb3Rvcm9sYSBtYW51YWwgc2F5cyB5ZXMsIGJ1dCBteSB0ZXN0cyBzYXkgdGhleSBsaWUKKyAgICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICBzeXN2NC4zKikKKyAgICAgIDs7CisgICAgc3lzdjQqTVAqKQorICAgICAgaWYgdGVzdCAtZCAvdXNyL25lYzsgdGhlbgorICAgICAgICBsZF9zaGxpYnM9eWVzCisgICAgICBmaQorICAgICAgOzsKKyAgICBzeXN2NC4ydXcyKikKKyAgICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgICAgIDs7CisgICAgc3lzdjVPcGVuVU5JWDgqIHwgc3lzdjVVbml4V2FyZTcqIHwgIHN5c3Y1dXdbNzhdKiB8IHVuaXh3YXJlNyopCisgICAgICA7OworICAgIHN5c3Y1KikKKyAgICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CisgICAgICA7OworICAgIHV0czQqKQorICAgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgICAgOzsKKyAgICAqKQorICAgICAgbGRfc2hsaWJzPW5vCisgICAgICA7OworICBlc2FjCitmaQorCisjIENoZWNrIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcworIyBDb2RlIHRha2VuIGZyb20gbGlidG9vbC5tNCdzIEFDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSLgorbGlibmFtZV9zcGVjPSdsaWIkbmFtZScKK2Nhc2UgIiRob3N0X29zIiBpbgorICBhaXgzKikKKyAgICA7OworICBhaXg0KiB8IGFpeDUqKQorICAgIDs7CisgIGFtaWdhb3MqKQorICAgIDs7CisgIGJlb3MqKQorICAgIDs7CisgIGJzZGk0KikKKyAgICA7OworICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiopCisgICAgc2hyZXh0PS5kbGwKKyAgICA7OworICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgIHNocmV4dD0uZHlsaWIKKyAgICA7OworICBkZ3V4KikKKyAgICA7OworICBmcmVlYnNkMSopCisgICAgOzsKKyAgZnJlZWJzZCopCisgICAgOzsKKyAgZ251KikKKyAgICA7OworICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICBpYTY0KikKKyAgICAgICAgc2hyZXh0PS5zbworICAgICAgICA7OworICAgICAgaHBwYSo2NCopCisgICAgICAgIHNocmV4dD0uc2wKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIHNocmV4dD0uc2wKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgIGlyaXg1KiB8IG5vbnN0b3B1eCopCisgICAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0KKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGNhc2UgJExEIGluCisgICAgICAgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikgbGlic3VmZj0gc2hsaWJzdWZmPSA7OworICAgICAgICAgICotbjMyfCoiLW4zMiAifCotbWVsZjMyYm1pcG4zMnwqIi1tZWxmMzJibWlwbjMyICIpIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiA7OworICAgICAgICAgICotNjR8KiItNjQgInwqLW1lbGY2NGJtaXB8KiItbWVsZjY0Ym1pcCAiKSBsaWJzdWZmPTY0IHNobGlic3VmZj02NCA7OworICAgICAgICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworICAgIGVzYWMKKyAgICA7OworICBsaW51eCpvbGRsZCogfCBsaW51eCphb3V0KiB8IGxpbnV4KmNvZmYqKQorICAgIDs7CisgIGxpbnV4KikKKyAgICA7OworICBuZXRic2QqKQorICAgIDs7CisgIG5ld3NvczYpCisgICAgOzsKKyAgbnRvLXFueCkKKyAgICA7OworICBvcGVuYnNkKikKKyAgICA7OworICBvczIqKQorICAgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgICAgc2hyZXh0PS5kbGwKKyAgICA7OworICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgOzsKKyAgc2NvMy4ydjUqKQorICAgIDs7CisgIHNvbGFyaXMqKQorICAgIDs7CisgIHN1bm9zNCopCisgICAgOzsKKyAgc3lzdjQgfCBzeXN2NC4ydXcyKiB8IHN5c3Y0LjMqIHwgc3lzdjUqKQorICAgIDs7CisgIHN5c3Y0Kk1QKikKKyAgICA7OworICB1dHM0KikKKyAgICA7OworZXNhYworCitzZWRfcXVvdGVfc3Vic3Q9J3MvXChbImAkXFxdXCkvXFxcMS9nJworZXNjYXBlZF93bD1gZWNobyAiWCR3bCIgfCBzZWQgLWUgJ3MvXlgvLycgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorc2hsaWJleHQ9YGVjaG8gIiRzaHJleHQiIHwgc2VkIC1lICdzLF5cLiwsJ2AKK2VzY2FwZWRfaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz1gZWNobyAiWCRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIiB8IHNlZCAtZSAncy9eWC8vJyAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKK3NlZCAtZSAncy9eXChbYS16QS1aMC05X10qXCk9L2FjbF9jdl9cMT0vJyA8PEVPRgorCisjIEhvdyB0byBwYXNzIGEgbGlua2VyIGZsYWcgdGhyb3VnaCB0aGUgY29tcGlsZXIuCit3bD0iJGVzY2FwZWRfd2wiCisKKyMgU3RhdGljIGxpYnJhcnkgc3VmZml4IChub3JtYWxseSAiYSIpLgorbGliZXh0PSIkbGliZXh0IgorCisjIFNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgInNvIikuCitzaGxpYmV4dD0iJHNobGliZXh0IgorCisjIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KKyMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9IiRlc2NhcGVkX2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0iJGhhcmRjb2RlX2RpcmVjdCIKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIHRoZSAtTERJUiBmbGFnIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX21pbnVzX0w9IiRoYXJkY29kZV9taW51c19MIgorCitFT0YKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9jb25maWd1cmUuaW4JMjAwNC0wOS0xMiAxNDozOTo1NS4xNjE3MDY0ODggLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvY29uZmlndXJlLmluCTIwMDQtMDktMTIgMTQ6NDA6MzUuODE2NTI2MDE2IC0wNDAwCkBAIC0yNjAsMTEgKzI2MCwxMCBAQAogQU1fR05VX0dFVFRFWFQKIAogQUNfREVGSU5FX1VOUVVPVEVEKExPQ0FMRURJUiwiJHByZWZpeC8kREFUQURJUk5BTUUiKQotQUNfTElOS19GSUxFUygkbmxzX2N2X2hlYWRlcl9saWJndCwgJG5sc19jdl9oZWFkZXJfaW50bCkKIAotQUNfT1VUUFVUKFtNYWtlZmlsZSBpbnRsL01ha2VmaWxlIGxpYi9NYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUgXAorQUNfT1VUUFVUKFtNYWtlZmlsZSBpbnRsL01ha2VmaWxlIGxpYi9NYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUgIG00L01ha2VmaWxlIFwKIG1hbi9NYWtlZmlsZSBwby9NYWtlZmlsZS5pbiBzcmMvTWFrZWZpbGUgZGViaWFuL3J1bGVzIFNwZWNmaWxlIHN5c3R5cGUgXAogc3JjL2xyenN6YnVnXSwKLVtzZWQgLWUgIi9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMiIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGU7IAorWwogY2htb2QgK3ggZGViaWFuL3J1bGVzOwogdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWhdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvYmluZHRleHRkb20uYwkxOTk4LTA0LTI2IDA5OjIyOjM2LjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2JpbmR0ZXh0ZG9tLmMJMjAwNC0wOS0xMiAxNDo0MDozNC4zNDM3NDk5MTIgLTA0MDAKQEAgLTEsNTkgKzEsNzUgQEAKIC8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogICAgYW55IGxhdGVyIHZlcnNpb24uCiAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLwogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogIyBpbmNsdWRlIDxjb25maWcuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KICNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgogI2VuZGlmCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKIAogI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KKy8qIFdlIGhhdmUgdG8gaGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCisjIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+CiAjZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisvKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUywgTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfd3Jsb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX3VubG9jayhOQU1FKQorI2VuZGlmCisKKy8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisgICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KKyNpZiAhZGVmaW5lZCBfTElCQworIyBkZWZpbmUgX25sX2RlZmF1bHRfZGlybmFtZSBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZQorIyBkZWZpbmUgX25sX2RvbWFpbl9iaW5kaW5ncyBsaWJpbnRsX25sX2RvbWFpbl9iaW5kaW5ncworI2VuZGlmCisKKy8qIFNvbWUgY29tcGlsZXJzLCBsaWtlIFN1bk9TNCBjYywgZG9uJ3QgaGF2ZSBvZmZzZXRvZiBpbiA8c3RkZGVmLmg+LiAgKi8KKyNpZm5kZWYgb2Zmc2V0b2YKKyMgZGVmaW5lIG9mZnNldG9mKHR5cGUsaWRlbnQpICgoc2l6ZV90KSYoKCh0eXBlKikwKS0+aWRlbnQpKQogI2VuZGlmCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCiAKIC8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KIAogLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLwogZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOworI2lmZGVmIF9MSUJDCitleHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lX2ludGVybmFsW10gYXR0cmlidXRlX2hpZGRlbjsKKyNlbHNlCisjIGRlZmluZSBJTlRVU0UobmFtZSkgbmFtZQorI2VuZGlmCiAKIC8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KIGV4dGVybiBzdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKIAorLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCitfX2xpYmNfcndsb2NrX2RlZmluZSAoZXh0ZXJuLCBfbmxfc3RhdGVfbG9jayBhdHRyaWJ1dGVfaGlkZGVuKQorCiAKIC8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKICAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKQEAgLTYxLDIzICs3Nyw0MSBAQAogICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KICNpZmRlZiBfTElCQwogIyBkZWZpbmUgQklORFRFWFRET01BSU4gX19iaW5kdGV4dGRvbWFpbgotIyBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKKyMgZGVmaW5lIEJJTkRfVEVYVERPTUFJTl9DT0RFU0VUIF9fYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKKyMgaWZuZGVmIHN0cmR1cAorIyAgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCisjIGVuZGlmCiAjZWxzZQotIyBkZWZpbmUgQklORFRFWFRET01BSU4gYmluZHRleHRkb21haW5fXworIyBkZWZpbmUgQklORFRFWFRET01BSU4gbGliaW50bF9iaW5kdGV4dGRvbWFpbgorIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldAogI2VuZGlmCiAKLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotY2hhciAqCi1CSU5EVEVYVERPTUFJTiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKKy8qIFNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IG5hbWUgKkRJUk5BTUVQIGFuZCB0aGUgb3V0cHV0IGNvZGVzZXQgKkNPREVTRVRQCisgICB0byBiZSB1c2VkIGZvciB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cuCisgICBJZiAqRElSTkFNRVAgb3IgKkNPREVTRVRQIGlzIE5VTEwsIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBpcyBub3QKKyAgIG1vZGlmaWVkLCBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIGlzIHJldHVybmVkLgorICAgSWYgRElSTkFNRVAgb3IgQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5laXRoZXIKKyAgIG1vZGlmaWVkIG5vciByZXR1cm5lZC4gICovCitzdGF0aWMgdm9pZAorc2V0X2JpbmRpbmdfdmFsdWVzIChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCQkgICAgY29uc3QgY2hhciAqKmRpcm5hbWVwLCBjb25zdCBjaGFyICoqY29kZXNldHApCiB7CiAgIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOworICBpbnQgbW9kaWZpZWQ7CiAKICAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KICAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCB8fCBkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIE5VTEw7CisgICAgeworICAgICAgaWYgKGRpcm5hbWVwKQorCSpkaXJuYW1lcCA9IE5VTEw7CisgICAgICBpZiAoY29kZXNldHApCisJKmNvZGVzZXRwID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX19saWJjX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICBtb2RpZmllZCA9IDA7CiAKICAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKICAgICB7CkBAIC05Myw4MSArMTI3LDE3MyBAQAogCX0KICAgICB9CiAKLSAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKLSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCi0gICAgcmV0dXJuIGJpbmRpbmcgPT0gTlVMTCA/IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWUgOiBiaW5kaW5nLT5kaXJuYW1lOwotCiAgIGlmIChiaW5kaW5nICE9IE5VTEwpCiAgICAgewotICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAotCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCi0JIG9sZCBiaW5kaW5nLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIGJpbmRpbmctPmRpcm5hbWUpICE9IDApCisgICAgICBpZiAoZGlybmFtZXApCiAJewotCSAgY2hhciAqbmV3X2Rpcm5hbWU7CisJICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOwogCi0JICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotCSAgICBuZXdfZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7CisJICBpZiAoZGlybmFtZSA9PSBOVUxMKQorCSAgICAvKiBUaGUgY3VycmVudCBiaW5kaW5nIGhhcyBiZSB0byByZXR1cm5lZC4gICovCisJICAgICpkaXJuYW1lcCA9IGJpbmRpbmctPmRpcm5hbWU7CiAJICBlbHNlCiAJICAgIHsKKwkgICAgICAvKiBUaGUgZG9tYWluIGlzIGFscmVhZHkgYm91bmQuICBJZiB0aGUgbmV3IHZhbHVlIGFuZCB0aGUgb2xkCisJCSBvbmUgYXJlIGVxdWFsIHdlIHNpbXBseSBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlIHJlcGxhY2UgdGhlCisJCSBvbGQgYmluZGluZy4gICovCisJICAgICAgY2hhciAqcmVzdWx0ID0gYmluZGluZy0+ZGlybmFtZTsKKwkgICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCByZXN1bHQpICE9IDApCisJCXsKKwkJICBpZiAoc3RyY21wIChkaXJuYW1lLCBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpID09IDApCisJCSAgICByZXN1bHQgPSAoY2hhciAqKSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisJCSAgZWxzZQorCQkgICAgewogI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCSAgICAgIG5ld19kaXJuYW1lID0gc3RyZHVwIChkaXJuYW1lKTsKLQkgICAgICBpZiAobmV3X2Rpcm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisJCSAgICAgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7CiAjZWxzZQotCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkgICAgICBuZXdfZGlybmFtZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAobmV3X2Rpcm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkgICAgICBtZW1jcHkgKG5ld19kaXJuYW1lLCBkaXJuYW1lLCBsZW4pOworCQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7CisJCSAgICAgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKwkJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKwkJCW1lbWNweSAocmVzdWx0LCBkaXJuYW1lLCBsZW4pOwogI2VuZGlmCisJCSAgICB9CisKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQorCQkgICAgeworCQkgICAgICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJCQlmcmVlIChiaW5kaW5nLT5kaXJuYW1lKTsKKworCQkgICAgICBiaW5kaW5nLT5kaXJuYW1lID0gcmVzdWx0OworCQkgICAgICBtb2RpZmllZCA9IDE7CisJCSAgICB9CisJCX0KKwkgICAgICAqZGlybmFtZXAgPSByZXN1bHQ7CiAJICAgIH0KKwl9CiAKLQkgIGlmIChiaW5kaW5nLT5kaXJuYW1lICE9IF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0JICAgIGZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOworICAgICAgaWYgKGNvZGVzZXRwKQorCXsKKwkgIGNvbnN0IGNoYXIgKmNvZGVzZXQgPSAqY29kZXNldHA7CiAKLQkgIGJpbmRpbmctPmRpcm5hbWUgPSBuZXdfZGlybmFtZTsKKwkgIGlmIChjb2Rlc2V0ID09IE5VTEwpCisJICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KKwkgICAgKmNvZGVzZXRwID0gYmluZGluZy0+Y29kZXNldDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKKwkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKKwkJIG9sZCBiaW5kaW5nLiAgKi8KKwkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5jb2Rlc2V0OworCSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCBzdHJjbXAgKGNvZGVzZXQsIHJlc3VsdCkgIT0gMCkKKwkJeworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorCQkgIHJlc3VsdCA9IHN0cmR1cCAoY29kZXNldCk7CisjZWxzZQorCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGNvZGVzZXQpICsgMTsKKwkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKwkJICAgIG1lbWNweSAocmVzdWx0LCBjb2Rlc2V0LCBsZW4pOworI2VuZGlmCisKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQorCQkgICAgeworCQkgICAgICBpZiAoYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQorCQkJZnJlZSAoYmluZGluZy0+Y29kZXNldCk7CisKKwkJICAgICAgYmluZGluZy0+Y29kZXNldCA9IHJlc3VsdDsKKwkJICAgICAgYmluZGluZy0+Y29kZXNldF9jbnRyKys7CisJCSAgICAgIG1vZGlmaWVkID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICAgICpjb2Rlc2V0cCA9IHJlc3VsdDsKKwkgICAgfQogCX0KICAgICB9CisgIGVsc2UgaWYgKChkaXJuYW1lcCA9PSBOVUxMIHx8ICpkaXJuYW1lcCA9PSBOVUxMKQorCSAgICYmIChjb2Rlc2V0cCA9PSBOVUxMIHx8ICpjb2Rlc2V0cCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAvKiBTaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCisgICAgICBpZiAoZGlybmFtZXApCisJKmRpcm5hbWVwID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworICAgICAgaWYgKGNvZGVzZXRwKQorCSpjb2Rlc2V0cCA9IE5VTEw7CisgICAgfQogICBlbHNlCiAgICAgewogICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCi0gICAgICBzaXplX3QgbGVuOworICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwogICAgICAgc3RydWN0IGJpbmRpbmcgKm5ld19iaW5kaW5nID0KLQkoc3RydWN0IGJpbmRpbmcgKikgbWFsbG9jIChzaXplb2YgKCpuZXdfYmluZGluZykpOworCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgYmluZGluZywgZG9tYWlubmFtZSkgKyBsZW4pOwogCi0gICAgICBpZiAobmV3X2JpbmRpbmcgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChuZXdfYmluZGluZyA9PSBOVUxMLCAwKSkKKwlnb3RvIGZhaWxlZDsKIAorICAgICAgbWVtY3B5IChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSwgZG9tYWlubmFtZSwgbGVuKTsKKworICAgICAgaWYgKGRpcm5hbWVwKQorCXsKKwkgIGNvbnN0IGNoYXIgKmRpcm5hbWUgPSAqZGlybmFtZXA7CisKKwkgIGlmIChkaXJuYW1lID09IE5VTEwpCisJICAgIC8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KKwkgICAgZGlybmFtZSA9IElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKSkgPT0gMCkKKwkJZGlybmFtZSA9IElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBjaGFyICpyZXN1bHQ7CiAjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0gICAgICBuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9IHN0cmR1cCAoZG9tYWlubmFtZSk7Ci0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKwkJICByZXN1bHQgPSBzdHJkdXAgKGRpcm5hbWUpOworCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCisJCSAgICBnb3RvIGZhaWxlZF9kaXJuYW1lOwogI2Vsc2UKLSAgICAgIGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotICAgICAgbmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7CisJCSAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOworCQkgIHJlc3VsdCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQorCQkgICAgZ290byBmYWlsZWRfZGlybmFtZTsKKwkJICBtZW1jcHkgKHJlc3VsdCwgZGlybmFtZSwgbGVuKTsKICNlbmRpZgotCi0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotCW5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKKwkJICBkaXJuYW1lID0gcmVzdWx0OworCQl9CisJICAgIH0KKwkgICpkaXJuYW1lcCA9IGRpcm5hbWU7CisJICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIGRpcm5hbWU7CisJfQogICAgICAgZWxzZQorCS8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KKwluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKworICAgICAgbmV3X2JpbmRpbmctPmNvZGVzZXRfY250ciA9IDA7CisKKyAgICAgIGlmIChjb2Rlc2V0cCkKIAl7CisJICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOworCisJICBpZiAoY29kZXNldCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqcmVzdWx0OworCiAjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0JICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7CisJICAgICAgcmVzdWx0ID0gc3RyZHVwIChjb2Rlc2V0KTsKKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQorCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OwogI2Vsc2UKLQkgIGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kaXJuYW1lLCBkaXJuYW1lLCBsZW4pOworCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGNvZGVzZXQpICsgMTsKKwkgICAgICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisJICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKKwkJZ290byBmYWlsZWRfY29kZXNldDsKKwkgICAgICBtZW1jcHkgKHJlc3VsdCwgY29kZXNldCwgbGVuKTsKICNlbmRpZgorCSAgICAgIGNvZGVzZXQgPSByZXN1bHQ7CisJICAgICAgbmV3X2JpbmRpbmctPmNvZGVzZXRfY250cisrOworCSAgICB9CisJICAqY29kZXNldHAgPSBjb2Rlc2V0OworCSAgbmV3X2JpbmRpbmctPmNvZGVzZXQgPSAoY2hhciAqKSBjb2Rlc2V0OwogCX0KKyAgICAgIGVsc2UKKwluZXdfYmluZGluZy0+Y29kZXNldCA9IE5VTEw7CiAKICAgICAgIC8qIE5vdyBlbnF1ZXVlIGl0LiAgKi8KICAgICAgIGlmIChfbmxfZG9tYWluX2JpbmRpbmdzID09IE5VTEwKQEAgLTE4NywxMyArMzEzLDUxIEBACiAJICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7CiAJfQogCi0gICAgICBiaW5kaW5nID0gbmV3X2JpbmRpbmc7CisgICAgICBtb2RpZmllZCA9IDE7CisKKyAgICAgIC8qIEhlcmUgd2UgZGVhbCB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLiAgKi8KKyAgICAgIGlmICgwKQorCXsKKwlmYWlsZWRfY29kZXNldDoKKwkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJICAgIGZyZWUgKG5ld19iaW5kaW5nLT5kaXJuYW1lKTsKKwlmYWlsZWRfZGlybmFtZToKKwkgIGZyZWUgKG5ld19iaW5kaW5nKTsKKwlmYWlsZWQ6CisJICBpZiAoZGlybmFtZXApCisJICAgICpkaXJuYW1lcCA9IE5VTEw7CisJICBpZiAoY29kZXNldHApCisJICAgICpjb2Rlc2V0cCA9IE5VTEw7CisJfQogICAgIH0KIAotICByZXR1cm4gYmluZGluZy0+ZGlybmFtZTsKKyAgLyogSWYgd2UgbW9kaWZpZWQgYW55IGJpbmRpbmcsIHdlIGZsdXNoIHRoZSBjYWNoZXMuICAqLworICBpZiAobW9kaWZpZWQpCisgICAgKytfbmxfbXNnX2NhdF9jbnRyOworCisgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7Cit9CisKKy8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAorICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLworY2hhciAqCitCSU5EVEVYVERPTUFJTiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSkKK3sKKyAgc2V0X2JpbmRpbmdfdmFsdWVzIChkb21haW5uYW1lLCAmZGlybmFtZSwgTlVMTCk7CisgIHJldHVybiAoY2hhciAqKSBkaXJuYW1lOworfQorCisvKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCisgICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KK2NoYXIgKgorQklORF9URVhURE9NQUlOX0NPREVTRVQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmNvZGVzZXQpCit7CisgIHNldF9iaW5kaW5nX3ZhbHVlcyAoZG9tYWlubmFtZSwgTlVMTCwgJmNvZGVzZXQpOworICByZXR1cm4gKGNoYXIgKikgY29kZXNldDsKIH0KIAogI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KKy8qIEFsaWFzZXMgZm9yIGZ1bmN0aW9uIG5hbWVzIGluIEdOVSBDIExpYnJhcnkuICAqLwogd2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOword2Vha19hbGlhcyAoX19iaW5kX3RleHRkb21haW5fY29kZXNldCwgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOwogI2VuZGlmCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9jYXQtY29tcGF0LmMJMTk5OC0wNC0yNiAwOToyMjozNy4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9jYXQtY29tcGF0LmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKQEAgLTEsMjYyICswLDAgQEAKLS8qIENvbXBhdGliaWxpdHkgY29kZSBmb3IgZ2V0dGV4dC11c2luZy1jYXRnZXRzIGludGVyZmFjZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBTVERDX0hFQURFUlMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfTkxfVFlQRVNfSAotIyBpbmNsdWRlIDxubF90eXBlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKLSAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKLSAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgQW5kIGV2ZW4gd29yc2U6IFBPU0lYCi0gICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKLSAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKLSNlbmRpZgotCi0vKiBUaGUgY2F0YWxvZyBkZXNjcmlwdG9yLiAgKi8KLXN0YXRpYyBubF9jYXRkIGNhdGFsb2cgPSAobmxfY2F0ZCkgLTE7Ci0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0X2NhdGFsb2dfbmFtZVtdID0gIm1lc3NhZ2VzIjsKLQotLyogTmFtZSBvZiBjdXJyZW50bHkgdXNlZCBjYXRhbG9nLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjYXRhbG9nX25hbWUgPSBkZWZhdWx0X2NhdGFsb2dfbmFtZTsKLQotLyogR2V0IElEIGZvciBnaXZlbiBzdHJpbmcuICBJZiBub3QgZm91bmQgcmV0dXJuIC0xLiAgKi8KLXN0YXRpYyBpbnQgbXNnX3RvX2NhdF9pZCBQQVJBTVMgKChjb25zdCBjaGFyICptc2cpKTsKLQotLyogU3Vic3RpdHV0aW9uIGZvciBzeXN0ZW1zIGxhY2tpbmcgdGhpcyBmdW5jdGlvbiBpbiB0aGVpciBDIGxpYnJhcnkuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jZW5kaWYKLQotCi0vKiBTZXQgY3VycmVudGx5IHVzZWQgZG9tYWluL2NhdGFsb2cuICAqLwotY2hhciAqCi10ZXh0ZG9tYWluIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotewotICBubF9jYXRkIG5ld19jYXRhbG9nOwotICBjaGFyICpuZXdfbmFtZTsKLSAgc2l6ZV90IG5ld19uYW1lX2xlbjsKLSAgY2hhciAqbGFuZzsKLQotI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTIFwKLSAgICAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKLSAgbGFuZyA9IHNldGxvY2FsZSAoTENfTUVTU0FHRVMsIE5VTEwpOwotI2Vsc2UKLSAgbGFuZyA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBsYW5nID0gZ2V0ZW52ICgiTENfTUVTU0FHRVMiKTsKLSAgICAgIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotCWxhbmcgPSBnZXRlbnYgKCJMQU5HIik7Ci0gICAgfQotI2VuZGlmCi0gIGlmIChsYW5nID09IE5VTEwgfHwgbGFuZ1swXSA9PSAnXDAnKQotICAgIGxhbmcgPSAiQyI7Ci0KLSAgLyogU2VlIHdoZXRoZXIgbmFtZSBvZiBjdXJyZW50bHkgdXNlZCBkb21haW4gaXMgYXNrZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci0KLSAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKLSAgICBkb21haW5uYW1lID0gZGVmYXVsdF9jYXRhbG9nX25hbWU7Ci0KLSAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgKi8KLSAgbmV3X25hbWVfbGVuID0gc2l6ZW9mIChMT0NBTEVESVIpIC0gMSArIDEgKyBzdHJsZW4gKGxhbmcpCi0JCSArIHNpemVvZiAoIi9MQ19NRVNTQUdFUy8iKSAtIDEgKyBzaXplb2YgKFBBQ0tBR0UpIC0gMQotCQkgKyBzaXplb2YgKCIuY2F0Iik7Ci0KLSAgbmV3X25hbWUgPSAoY2hhciAqKSBtYWxsb2MgKG5ld19uYW1lX2xlbik7Ci0gIGlmIChuZXdfbmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN0cmNweSAobmV3X25hbWUsIFBBQ0tBR0UpOwotICBuZXdfY2F0YWxvZyA9IGNhdG9wZW4gKG5ld19uYW1lLCAwKTsKLQotICBpZiAobmV3X2NhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotICAgIHsKLSAgICAgIC8qIE5MU1BBVEggc2VhcmNoIGRpZG4ndCB3b3JrLCB0cnkgYWJzb2x1dGUgcGF0aCAqLwotICAgICAgc3ByaW50ZiAobmV3X25hbWUsICIlcy8lcy9MQ19NRVNTQUdFUy8lcy5jYXQiLCBMT0NBTEVESVIsIGxhbmcsCi0JICAgICAgIFBBQ0tBR0UpOwotICAgICAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7Ci0KLSAgICAgIGlmIChuZXdfY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0JewotCSAgZnJlZSAobmV3X25hbWUpOwotCSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLQl9Ci0gICAgfQotCi0gIC8qIENsb3NlIG9sZCBjYXRhbG9nLiAgKi8KLSAgaWYgKGNhdGFsb2cgIT0gKG5sX2NhdGQpIC0xKQotICAgIGNhdGNsb3NlIChjYXRhbG9nKTsKLSAgaWYgKGNhdGFsb2dfbmFtZSAhPSBkZWZhdWx0X2NhdGFsb2dfbmFtZSkKLSAgICBmcmVlICgoY2hhciAqKSBjYXRhbG9nX25hbWUpOwotCi0gIGNhdGFsb2cgPSBuZXdfY2F0YWxvZzsKLSAgY2F0YWxvZ19uYW1lID0gbmV3X25hbWU7Ci0KLSAgcmV0dXJuIChjaGFyICopIGNhdGFsb2dfbmFtZTsKLX0KLQotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSNpZiBIQVZFX1NFVEVOViB8fCBIQVZFX1BVVEVOVgotICBjaGFyICpvbGRfdmFsLCAqbmV3X3ZhbCwgKmNwOwotICBzaXplX3QgbmV3X3ZhbF9sZW47Ci0KLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgaGVyZSBidXQgdG8gYmUgY29tcGF0aWJsZSBkbyBpdC4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ29tcHV0ZSBsZW5ndGggb2YgYWRkZWQgcGF0aCBlbGVtZW50LiAgSWYgd2UgdXNlIHNldGVudiB3ZSBkb24ndCBuZWVkCi0gICAgIHRoZSBmaXJzdCBieXRzIGZvciBOTFNQQVRIPSwgYnV0IHdoeSBjb21wbGljYXRlIHRoZSBjb2RlIGZvciB0aGlzCi0gICAgIHBlYW51dHMuICAqLwotICBuZXdfdmFsX2xlbiA9IHNpemVvZiAoIk5MU1BBVEg9IikgLSAxICsgc3RybGVuIChkaXJuYW1lKQotCQkrIHNpemVvZiAoIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLQotICBvbGRfdmFsID0gZ2V0ZW52ICgiTkxTUEFUSCIpOwotICBpZiAob2xkX3ZhbCA9PSBOVUxMIHx8IG9sZF92YWxbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBvbGRfdmFsID0gTlVMTDsKLSAgICAgIG5ld192YWxfbGVuICs9IDEgKyBzaXplb2YgKExPQ0FMRURJUikgLSAxCi0JICAgICAgICAgICAgICsgc2l6ZW9mICgiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotICAgIH0KLSAgZWxzZQotICAgIG5ld192YWxfbGVuICs9IHN0cmxlbiAob2xkX3ZhbCk7Ci0KLSAgbmV3X3ZhbCA9IChjaGFyICopIG1hbGxvYyAobmV3X3ZhbF9sZW4pOwotICBpZiAobmV3X3ZhbCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0jIGlmIEhBVkVfU0VURU5WCi0gIGNwID0gbmV3X3ZhbDsKLSMgZWxzZQotICBjcCA9IHN0cGNweSAobmV3X3ZhbCwgIk5MU1BBVEg9Iik7Ci0jIGVuZGlmCi0KLSAgY3AgPSBzdHBjcHkgKGNwLCBkaXJuYW1lKTsKLSAgY3AgPSBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdDoiKTsKLQotICBpZiAob2xkX3ZhbCA9PSBOVUxMKQotICAgIHsKLSMgaWYgX19TVERDX18KLSAgICAgIHN0cGNweSAoY3AsIExPQ0FMRURJUiAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotIyBlbHNlCi0KLSAgICAgIGNwID0gc3RwY3B5IChjcCwgTE9DQUxFRElSKTsKLSAgICAgIHN0cGNweSAoY3AsICIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0jIGVuZGlmCi0gICAgfQotICBlbHNlCi0gICAgc3RwY3B5IChjcCwgb2xkX3ZhbCk7Ci0KLSMgaWYgSEFWRV9TRVRFTlYKLSAgc2V0ZW52ICgiTkxTUEFUSCIsIG5ld192YWwsIDEpOwotICBmcmVlIChuZXdfdmFsKTsKLSMgZWxzZQotICBwdXRlbnYgKG5ld192YWwpOwotICAvKiBEbyAqbm90KiBmcmVlIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB3ZSBqdXN0IGVudGVyZWQuICBJdCBpcyB1c2VkCi0gICAgIGZyb20gbm93IG9uLiAgICovCi0jIGVuZGlmCi0KLSNlbmRpZgotCi0gIHJldHVybiAoY2hhciAqKSBkb21haW5uYW1lOwotfQotCi0jdW5kZWYgZ2V0dGV4dAotY2hhciAqCi1nZXR0ZXh0IChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IG1zZ2lkOwotCi0gIGlmIChtc2cgPT0gTlVMTCB8fCBjYXRhbG9nID09IChubF9jYXRkKSAtMSkKLSAgICByZXR1cm4gKGNoYXIgKikgbXNnOwotCi0gIC8qIEdldCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBjYXRhbG9nLiAgV2UgYWx3YXlzIHVzZSBzZXQgbnVtYmVyIDEuCi0gICAgIFRoZSBtZXNzYWdlIElEIGlzIGNvbXB1dGVkIGJ5IHRoZSBmdW5jdGlvbiBgbXNnX3RvX2NhdF9pZCcKLSAgICAgd2hpY2ggd29ya3Mgb24gdGhlIHRhYmxlIGdlbmVyYXRlZCBieSBgcG8tdG8tdGJsJy4gICovCi0gIG1zZ2lkID0gbXNnX3RvX2NhdF9pZCAobXNnKTsKLSAgaWYgKG1zZ2lkID09IC0xKQotICAgIHJldHVybiAoY2hhciAqKSBtc2c7Ci0KLSAgcmV0dXJuIGNhdGdldHMgKGNhdGFsb2csIDEsIG1zZ2lkLCAoY2hhciAqKSBtc2cpOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHRhYmxlIGBfbXNnX3RibCcgd2hpY2ggaGFzIGBfbXNnX3RibF9sZW5ndGgnIGVudHJpZXMKLSAgIGZvciB0aGUgb25lIGVxdWFsIHRvIG1zZy4gIElmIGl0IGlzIGZvdW5kIHJldHVybiB0aGUgSUQuICBJbiBjYXNlIHdoZW4KLSAgIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kIHJldHVybiAtMS4gICovCi1zdGF0aWMgaW50Ci1tc2dfdG9fY2F0X2lkIChtc2cpCi0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGNudDsKLQotICBmb3IgKGNudCA9IDA7IGNudCA8IF9tc2dfdGJsX2xlbmd0aDsgKytjbnQpCi0gICAgaWYgKHN0cmNtcCAobXNnLCBfbXNnX3RibFtjbnRdLl9tc2cpID09IDApCi0gICAgICByZXR1cm4gX21zZ190YmxbY250XS5fbXNnX251bWJlcjsKLQotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvQ2hhbmdlTG9nCTE5OTgtMDQtMjYgMDk6MjI6MzUuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvQ2hhbmdlTG9nCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzQ5NzQ5MDAwIC0wNDAwCkBAIC0xLDEwMjIgKzEsNCBAQAotMTk5Ny0wOS0wNiAwMjoxMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGludGxoLmluc3QuaW46IFJlZm9ybWF0IGNvcHlyaWdodC4KLQotMTk5Ny0wOC0xOSAxNToyMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBSZW1vdmUgd3JvbmcgY29tbWVudC4KLQotMTk5Ny0wOC0xNiAwMDoxMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWRhdGEpOiBEb24ndCBjaGFuZ2UgZGlyZWN0b3J5IHRvIGluc3RhbGwuCi0KLTE5OTctMDgtMDEgMTQ6MzAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCBjb3B5cmlnaHQuCi0KLQkqIGxvY2FsZWFsaWFzLmM6IERvbid0IGRlZmluZSBzdHJjaHIgdW5sZXNzICFIQVZFX1NUUkNIUi4KLQotCSogbG9hZG1zZ2NhdC5jOiBVcGRhdGUgY29weXJpZ2h0LiAgRml4IHR5cG9zLgotCi0JKiBsMTBuZmxpc3QuYzogRG9uJ3QgZGVmaW5lIHN0cmNociB1bmxlc3MgIUhBVkVfU1RSQ0hSLgotCShfbmxfbWFrZV9sMTBuZmxpc3QpOiBIYW5kbGUgc3BvbnNvciBhbmQgcmV2aXNpb24gY29ycmVjdGx5LgotCi0JKiBnZXR0ZXh0LmM6IFVwZGF0ZSBjb3B5cmlnaHQuCi0JKiBnZXR0ZXh0Lmg6IExpa2V3aXNlLgotCSogaGFzaC1zdHJpbmcuaDogTGlrZXdpc2UuCi0KLQkqIGZpbmRkb21haW4uYzogUmVtb2F2ZSBkZWFkIGNvZGUuICBEZWZpbmUgc3RyY2hyIG9ubHkgaWYKLQkhSEFWRV9TVFJDSFIuCi0KLQkqIGV4cGxvZGVuYW1lLmM6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQotCSogZXhwbG9kZW5hbWUuYzogUmVmb3JtYXQgY29weXJpZ2h0IHRleHQuCi0JKF9ubF9leHBsb2RlX25hbWUpOiBGaXggdHlwby4KLQotCSogZGNnZXR0ZXh0LmM6IERlZmluZSBhbmQgdXNlIF9fc2V0X2Vycm5vLgotCShndWVzc19jYXRlZ29yeV92YWx1ZSk6IERvbid0IHVzZSBzZXRsb2NhbGUgaWYgSEFWRV9MQ19NRVNTQUdFUyBpcwotCW5vdCBkZWZpbmVkLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBQcmV0dHkgcHJpbnRpbmcuCi0KLTE5OTctMDUtMDEgMDI6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBkY2dldHRleHQuYyAoZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUpOiBEb24ndCBkZXBlbmQgb24KLQlIQVZFX0xDX01FU1NBR0VTLiAgV2UgZG9uJ3QgbmVlZCB0aGUgbWFjcm8gaGVyZS4KLQlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KLQotCSogY2F0LWNvbXBhdC5jICh0ZXh0ZG9tYWluKTogRG9OJ3QgcmVmZXIgdG8gSEFWRV9TRVRMT0NBTEVfTlVMTAotCW1hY3JvLiAgSW5zdGVhZCB1c2UgSEFWRV9MT0NBTEVfTlVMTCBhbmQgZGVmaW5lIGl0IHdoZW4gdXNpbmcKLQlnbGliYywgYXMgaW4gZGNnZXR0ZXh0LmMuCi0JUGF0Y2ggYnkgQnJ1bm8gSGFpYmxlIDxoYWlibGVAaWxvZy5mcj4uCi0KLQkqIE1ha2VmaWxlLmluIChDUFBGTEFHUyk6IE5ldyB2YXJpYWJsZS4gIFJlcG9ydGVkIGJ5IEZyYW5jLG9pcwotCVBpbmFyZC4KLQotTW9uIE1hciAxMCAwNjo1MToxNyAxOTk3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEltcGxlbWVudCBoYW5kbGluZyBvZiBsaWJ0b29sLgotCi0JKiBnZXR0ZXh0UC5oOiBDaGFuZ2UgZGF0YSBzdHJ1Y3R1cmVzIGZvciB1c2Ugb2YgZ2VuZXJpYyBsb3dsZXZlbAotCWkxOG4gZmlsZSBoYW5kbGluZy4KLQotV2VkIERlYyAgNCAyMDoyMToxOCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogdGV4dGRvbWFpbi5jOiBQdXQgcGFyZW50aGVzZXMgYXJvdW5kIGFyZ3VtZW50cyBvZiBtZW1jcHkgbWFjcm8KLQlkZWZpbml0aW9uLgotCSogbG9jYWxlYWxpYXMuYzogTGlrZXdpc2UuCi0JKiBsMTBuZmxpc3QuYzogTGlrZXdpc2UuCi0JKiBmaW5kZG9tYWluLmM6IExpa2V3aXNlLgotCSogYmluZHRleHRkb20uYzogTGlrZXdpc2UuCi0JUmVwb3J0ZWQgYnkgVGhvbWFzIEVza2VuLgotCi1Nb24gTm92IDI1IDIyOjU3OjUxIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiB0ZXh0ZG9tYWluLmM6IE1vdmUgZGVmaW5pdGlvbiBvZiBgbWVtY3B5YCBtYWNybyB0byByaWdodAotCXBvc2l0aW9uLgotCi1GcmkgTm92IDIyIDA0OjAxOjU4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBmaW5kZG9tYWluLmMgWyFIQVZFX1NUUklOR19IICYmICFfTElCQ106IERlZmluZSBtZW1jcHkgdXNpbmcKLSAJYmNvcHkgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4gIFJlcG9ydGVkIGJ5IFRob21hcyBFc2tlbi4KLQkqIGJpbmR0ZXh0ZG9tLmM6IExpa2V3aXNlLgotCSogbDEwbmZsaXN0LmM6IExpa2V3aXNlLgotCSogbG9jYWxlYWxpYXMuYzogTGlrZXdpc2UuCi0JKiB0ZXh0ZG9tYWluLmM6IExpa2V3aXNlLgotCi1UdWUgT2N0IDI5IDExOjEwOjI3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobGliZGlyKTogQ2hhbmdlIHRvIHVzZSBleGVjX3ByZWZpeCBpbnN0ZWFkIG9mCi0gCXByZWZpeC4gIFJlcG9ydGVkIGJ5IEtudXQtSOV2YXJkQWtzbmVzIDxldG9rbmFAZXRvLmVyaWNzc29uLnNlPi4KLQotU2F0IEF1ZyAzMSAwMzowNzowOSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmMgKF9ubF9ub3JtYWxpemVfY29kZXNldCk6IFdlIGNvbnZlcnQgdG8gbG93ZXIgY2FzZSwKLQlzbyBkb24ndCBwcmVwZW5kIHVwcGVyY2FzZSBgSVNPJyBmb3Igb25seSBudW1lcmljIGFyZy4KLQotRnJpIEp1bCAxOSAwMDoxNTo0NiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmM6IE1vdmUgaW5jbHVzaW9uIG9mIGFyZ3ouaCwgY3R5cGUuaCwgc3RkbGliLmggYWZ0ZXIKLQlkZWZpbml0aW9uIG9mIF9HTlVfU09VUkNFLiAgUGF0Y2ggYnkgUm9sYW5kIE1jR3JhdGguCi0KLQkqIE1ha2VmaWxlLmluICh1bmluc3RhbGwpOiBGaXggYW5vdGhlciBidWcgd2l0aCBgZm9yJyBsb29wIGFuZAotCWVtcHR5IGFyZ3VtZW50cy4gIFBhdGNoIGJ5IEppbSBNZXllcmluZy4gIENvcnJlY3QgbmFtZSBvcwotCXVuaW5zdGFsbGVkIGZpbGVzOiBubyBpbnRsLSBwcmVmaXggYW55bW9yZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGF0YSk6IEFnYWluIHdvcmsgYXJvdW5kIHNoZWxscyB3aGljaAotCWNhbm5vdCBoYW5kbGUgbXB0eSBmb3IgbGlzdC4gIFJlcG9ydGVkIGJ5IEppbSBNZXllcmluZy4KLQotU2F0IEp1bCAxMyAxODoxMTozNSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBTcGxpdCBnb2FsLiAgTm93IGRlcGVuZCBvbiBpbnN0YWxsLWV4ZWMKLSAgICAgICAgYW5kIGluc3RhbGwtZGF0YS4KLQkoaW5zdGFsbC1leGVjLCBpbnN0YWxsLWRhdGEpOiBOZXcgZ29hbHMuICBDcmVhdGVkIGZyb20gZm9ybWVyCi0JaW5zdGFsbCBnb2FsLgotCVJlcG9ydGVkIGJ5IEthcmwgQmVycnkuCi0KLVNhdCBKdW4gMjIgMDQ6NTg6MTQgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChNS0lOU1RBTExESVJTKTogTmV3IHZhcmlhYmxlLiAgUGF0aCB0bwotICAgICAgICBta2luc3RhbGxkaXJzIHNjcmlwdC4KLQkoaW5zdGFsbCk6IHVzZSBNS0lOU1RBTExESVJTIHZhcmlhYmxlIG9yIGlmIHRoZSBzY3JpcHQgaXMgbm90IHByZXNlbnQKLQl0cnkgdG8gZmluZCBpdCBpbiB0aGUgJHRvcF9zY3JkaXIpLgotCi1XZWQgSnVuIDE5IDAyOjU2OjU2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYzogTGludXggbGliYyAqcGFydGx5KiBpbmNsdWRlcyB0aGUgYXJnel8qIGZ1bmN0aW9ucy4KLQlHcnIuICBXb3JrIGFyb3VuZCBieSByZW5hbWluZyB0aGUgc3RhdGljIHZlcnNpb24gYW5kIHVzZSBtYWNyb3MKLQlmb3IgcmVuYW1pbmcuCi0KLVR1ZSBKdW4gMTggMjA6MTE6MTcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jOiBDb3JyZWN0IHByZXNlbmNlIHRlc3QgbWFjcm9zIG9mIF9fYXJnel8qIGZ1bmN0aW9ucy4KLQotCSogbDEwbmZsaXN0LmM6IEluY2x1ZGUgPGFyZ3ouaD4gYmFzZWQgb24gdGVzdCBvZiBpdCBpbnN0ZWFkIHdoZW4KLQlfX2FyZ3pfKiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZS4KLQlSZXBvcnRlZCBieSBBbmRyZWFzIFNjaHdhYi4KLQotVGh1IEp1biAxMyAxNToxNzo0NCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZXhwbG9kZW5hbWUuYywgbDEwbmZsaXN0LmM6IERlZmluZSBOVUxMIGZvciBkdW1iIHN5c3RlbXMuCi0KLVR1ZSBKdW4gMTEgMTc6MDU6MTMgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGludGxoLmluc3QuaW4sIGxpYmdldHRleHQuaCAoZGNnZXR0ZXh0KTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlCi0JcmVzdWx0IHRvIF9fcmVzdWx0IHRvIHByZXZlbnQgbmFtZSBjbGFzaC4KLQotCSogbDEwbmZsaXN0LmMsIGxvY2FsZWFsaWFzLmMsIGRjZ2V0dGV4dC5jOiBEZWZpbmUgX0dOVV9TT1VSQ0UgdG8KLSAgICAgICAgZ2V0IHByb3RvdHlwZSBmb3Igc3RwY3B5IGFuZCBzdHJjYXNlY21wLgotCi0JKiBpbnRsaC5pbnN0LmluLCBsaWJnZXR0ZXh0Lmg6IE1vdmUgZGVjbGFyYXRpb24gb2YKLQlgX25sX21zZ19jYXRfY250cicgb3V0c2lkZSBfX2V4dGVuc2lvbl9fIGJsb2NrIHRvIHByZXZlbnQgd2FybmluZwotCWZyb20gZ2NjJ3MgLVduZXN0ZWQtZXh0ZXJuIG9wdGlvbi4KLQotRnJpIEp1biAgNyAwMTo1ODowMCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgY29tbWVudC4KLQotVGh1IEp1biAgNiAxNzoyODoxNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBXb3JrIGFyb3VuZCBmb3IgYW5vdGhlciBCdWdsaXggc3R1cGlkaXR5LgotCUFsd2F5cyB1c2UgYW4gYGVsc2UnIGNsb3NlIGZvciBgaWYncy4gIFJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotCSogTWFrZWZpbGUuaW4gKGludGxoLmluc3QpOiBDb3JyZWN0IHR5cG8gaW4gcGhvbnkgcnVsZS4KLQlSZXBvcnRlZCBieSBOZWxzb24gQmVlYmUuCi0KLVRodSBKdW4gIDYgMDE6NDk6NTIgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jIChyZWFkX2FsaWFzX2ZpbGUpOiBSZW5hbWUgdmFyaWFibGUgYWxsb2NhX2xpc3QgdG8KLQlibG9ja19saXN0IGFzIHRoZSBtYWNybyBjYWxscyBhc3N1bWUuCi0JUGF0Y2ggYnkgRXJpYyBCYWNrdXMuCi0KLQkqIGxvY2FsZWFsaWFzLmMgWyFIQVZFX0FMTE9DQV06IERlZmluZSBhbGxvY2EgYXMgbWFjcm8gdXNpbmcKLSAgICAgICAgbWFsbG9jLgotCShyZWFkX2FsaWFzX2ZpbGUpOiBSZW5hbWUgdmFycmlhYmUgYWxsb2NhX2xpc3QgdG8gYmxvY2tfbGlzdCBhcyB0aGUKLQltYWNybyBjYWxscyBhc3N1bWUuCi0JUGF0Y2ggYnkgRXJpYyBCYWNrdXMuCi0KLQkqIGwxMG5mbGlzdC5jOiBDb3JyZWN0IGNvbmRpdGlvbmFsIGZvciA8YXJnei5oPiBpbmNsdXNpb24uCi0JUmVwb3J0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZXBlbmQgb24gYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAsIG5vdAotICAgICAgICBhbGwtQFVTRV9OTFNALgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGludGxoLmluc3QgY29tZXMgZnJvbSBsb2NhbCBkaXIsIG5vdAotICAgICAgICAkKHNyY2RpcikuCi0KLQkqIE1ha2VmaWxlLmluIChpbnRsaC5pbnN0KTogU3BlY2lhbCBoYW5kbGluZyBvZiB0aGlzIGdvYWwuICBJZgotCXVzZWQgaW4gZ2V0dGV4dCwgdGhpcyBpcyByZWFsbHkgYSBydWwgdG8gY29uc3RydWN0IHRoaXMgZmlsZS4gIElmCi0JdXNlZCBpbiBhbnkgb3RoZXIgcGFja2FnZSBpdCBpcyBkZWZpbmVkIGFzIGEgLlBIT05ZIHJ1bGUgd2l0aAotCWVtcHR5IGJvZHkuCi0KLQkqIGZpbmRkb21haW4uYzogRXh0cmFjdCBsb2NhbGUgZmlsZSBpbmZvcm1hdGlvbiBoYW5kbGluZyBpbnRvCi0JbDEwbmZpbGUuYy4gIFJlbmFtZSBsb2NhbCBzdHBjcHlfXyBmdW5jdGlvbiB0byBzdHBjcHkuCi0KLQkqIGRjZ2V0dGV4dC5jIChzdHBjcHkpOiBBZGQgbG9jYWwgZGVmaW5pdGlvbi4KLQotCSogbDEwbmZsaXN0LmM6IFNvbHZlIHNvbWUgcG9ydGFiaWxpdHkgcHJvYmxlbXMuICBQYXRjaGVzIHBhcnRseSBieQotCVRob21hcyBFc2tlbi4gIEFkZCBsb2NhbCBkZWZpbml0aW9uIG9mIHN0cGNweS4KLQotVHVlIEp1biAgNCAwMjo0Nzo0OSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbjogRG9uJ3QgZGVwZW5kIGluY2x1ZGluZyA8bG9jYWxlLmg+IG9uCi0JSEFWRV9MT0NBTEVfSC4gIEluc3RlYWQgY29uZmlndXJlIG11c3QgcmV3cml0ZSB0aGlzIGZpaWxlCi0JZGVwZW5kaW5nIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNvbmZpZ3VyZSBydW4uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogbGliaW50bC5pbnN0IGlzIG5vdyBjYWxsZWQgaW50bGguaW5zdC4KLQlBZGQgcnVsZXMgZm9yIHVwZGF0aW5nIGludGxoLmluc3QgZnJvbSBpbnRsaC5pbnN0LmluLgotCi0JKiBsaWJpbnRsLmluc3Q6IFJlbmFtZWQgdG8gaW50bGguaW5zdC5pbi4KLQotCSogbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmMgW19fR05VQ19fXTogRGVmaW5lIEhBVkVfQUxMT0NBIHRvIDEKLSAgICAgICAgYmVjYXVzZSBnY2MgaGFzIF9fYnVpdGxpbl9hbGxvY2EuCi0JUmVwb3J0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLU1vbiBKdW4gIDMgMDA6MzI6MTYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsY2hlY2spOiBOZXcgZ29hbCB0byBmdWxmaWxsIG5lZWRzIG9mCi0gICAgICAgIGF1dG9tYWtlJ3MgZGlzdGNoZWNrLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlb3JkZXIgY29tbWFuZHMgc28gdGhhdCBWRVJTSU9OIGlzCi0gICAgICAgIGZvdW5kLgotCi0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6IE5vdyB1c2Ugc3ViZGlyZWN0b3J5IGludGwvIGluCi0gICAgICAgIEBkYXRhZGlyQC9nZXR0ZXh0LgotCShDT01TUkNTKTogQWRkIGwxMG5maWxlLmMuCi0JKE9CSkVDVFMpOiBBZGQgbDEwbmZpbGUuby4KLQkoRElTVEZJTEVTKTogUmVuYW1lIHRvIERJU1RGSUxFLm5vcm1hbC4gIFJlbW92ZSAkKERJU1RGSUxFUy5jb21tb24pLgotCShESVNURklMRS5nZXR0ZXh0KTogUmVtb3ZlICQoRElTVEZJTEVTLmNvbW1vbikuCi0JKGFsbC1nZXR0ZXh0KTogUmVtb3ZlIGdvYWwuCi0JKGluc3RhbGwpOiBJZiAkKFBBQ0tBR0UpID0gZ2V0dGV4dCBpbnN0YWxsLCBvdGhlcndvc2UgZG8gbm90aGluZy4gIE5vCi0JcGFja2FnZSBidXQgZ2V0dGV4dCBpdHNlbGYgc2hvdWxkIGluc3RhbGwgbGliaW50bC5oICsgaGVhZGVycy4KLQkoZGlzdCk6IEV4dGVuZCBnb2FsIHRvIHdvcmsgZm9yIGdldHRleHQsIHRvby4KLQkoZGlzdC1nZXR0ZXh0KTogUmVtb3ZlIGdvYWwuCi0KLQkqIGRjZ2V0dGV4dC5jIFshSEFWRV9BTExPQ0FdOiBEZWZpbmUgbWFjcm8gYWxsb2NhIGJ5IHVzaW5nIG1hbGxvYy4KLQotU3VuIEp1biAgMiAxNzozMzowNiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOiBQYXJhbWV0ZXIgaXMgbm93IGNvbWVzIGZyb20KLSAgICAgICAgZmluZF9sMTBuZmlsZS4KLQotU2F0IEp1biAgMSAwMjoyMzowMyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmMgKF9fYXJnel9uZXh0KTogQWRkIGRlZmluaXRpb24uCi0KLQkqIGRjZ2V0dGV4dC5jIFshSEFWRV9BTExPQ0FdOiBBZGQgY29kZSBmb3IgaGFuZGxpbmcgbWlzc2luZyBhbGxvY2EKLQljb2RlLiAgVXNlIG5ldyBsMTBuZmlsZSBoYW5kbGluZy4KLQotCSogbG9jYWxlYWxpYXMuYyBbIUhBVkVfQUxMT0NBXTogQWRkIGNvZGUgZm9yIGhhbmRsaW5nIG1pc3NpbmcKLSAgICAgICAgYWxsb2NhIGNvZGUuCi0KLQkqIGwxMG5mbGlzdC5jOiBJbml0aWFsIHJldmlzaW9uLgotCi1UdWUgQXByICAyIDE4OjUxOjE4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2V0dGV4dCk6IE5ldyBnb2FsLiAgU2FtZSBhcyBhbGwteWVzLgotCi1UaHUgTWFyIDI4IDIzOjAxOjIyIDE5OTYgIEthcmwgRWljaHdhbGRlciAgPGtlQGtlLmNlbnRyYWwuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKTogRGVmaW5lIHVzaW5nIEBkYXRhZGlyQC4KLQotVHVlIE1hciAyNiAxMjozOToxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmM6IEluY2x1ZGUgPGN0eXBlLmg+LiAgUmVwb3J0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLVNhdCBNYXIgMjMgMDI6MDA6MzUgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBSZW5hbWUgdG8gc3RwY3B5X18gdG8gcHJldmVudCBjbGFzaGluZwotICAgICAgICB3aXRoIGV4dGVybmFsIGRlY2xhcmF0aW9uLgotCi1TYXQgTWFyICAyIDAwOjQ3OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtbm8pOiBSZW5hbWUgZnJvbSBhbGxfbm8uCi0KLVNhdCBGZWIgMTcgMDA6MjU6NTkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZ2V0dGV4dFAuaCBbbG9hZGVkX2RvbWFpbl06IEFycmF5IGBzdWNjZXNzb3InIG11c3Qgbm93IGNvbnRhaW4gdXAKLSAgICAgICAgdG8gNjMgZWxlbWVudHMgKGJlY2F1c2Ugb2YgY29kZXNldCBuYW1lIG5vcm1hbGl6YXRpb24pLgotCi0JKiBmaW5kZG9tYWluLmM6IEltcGxlbWVudCBjb2Rlc2V0IG5hbWUgbm9ybWFsaXphdGlvbi4KLQotVGh1IEZlYiAxNSAwNDozOTowOSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsKTogRGVmaW5lIHRvIGBhbGwtQFVTRV9OTFNAJy4KLQkoYWxsLXllcywgYWxsX25vKTogTmV3IGdvYWxzLiAgYGFsbC1ubycgaXMgbm9vcCwgYGFsbC15ZXMnCi0JaXMgZm9ybWVyIGFsbC4KLQotTW9uIEphbiAxNSAyMTo0NjowMSAxOTk2ICBIb3dhcmQgR2F5bGUgIDxob3dhcmRAaGFsLmNvbT4KLQotCSogbG9jYWxlYWxpYXMuYyAoYWxpYXNfY29tcGFyZSk6IEluY3JlbWVudCBzdHJpbmcgcG9pbnRlcnMgaW4gbG9vcAotICAgICAgICBvZiBzdHJjYXNlY21wIHJlcGxhY2VtZW50LgotCi1GcmkgRGVjIDI5IDIxOjE2OjM0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IFdobyBjb21tZW50ZWQgdGhpcyBnb2FsIG91dCA/IDotKQotCi1GcmkgRGVjIDI5IDE1OjA4OjE2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOiBTYXZlIGBlcnJubycuICBGYWlsaW5nIHN5c3RlbSBjYWxscwotCXNob3VsZCBub3QgZWZmZWN0IGl0IGJlY2F1c2UgYSBtaXNzaW5nIGNhdGFsb2cgaXMgbm8gZXJyb3IuCi0JUmVwb3J0ZWQgYnkgSGFyYWxkIEs8bzo+bmlnIDxrb2VuaWdAdGF0LnBoeXNpay51bmktdHVlYmluZ2VuLmRlPi4KLQotVHVlIERlYyAxOSAyMjowOToxMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBFeHBsaWNpdGx5IHVzZSAkKFNIRUxMKSBmb3IgcnVubmluZwotICAgICAgICBzaGVsbCBzY3JpcHRzLgotCi1GcmkgRGVjIDE1IDE3OjM0OjU5IDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOiBPbmx5IGluc3RhbGwgbGlicmFyeSBhbmQgaGVhZGVyIHdoZW4KLQl3ZSB1c2UgdGhlIG93biBpbXBsZW1lbnRhdGlvbi4gIERvbid0IGRvIGl0IHdoZW4gdXNpbmcgdGhlCi0Jc3lzdGVtJ3MgZ2V0dGV4dCBvciBjYXRnZXRzIGZ1bmN0aW9ucy4KLQotCSogZGNnZXR0ZXh0LmMgKGZpbmRfbXNnKTogTXVzdCBub3Qgc3dhcCBkb21haW4tPmhhc2hfc2l6ZSBoZXJlLgotCi1TYXQgRGVjICA5IDE2OjI0OjM3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMsIGxpYmludGwuaW5zdCwgbGliZ2V0dGV4dC5oLCBoYXNoLXN0cmluZy5oLAotCWdldHRleHRQLmgsIGZpbmRkb21haW4uYywgZGNnZXR0ZXh0LmMsIGNhdC1jb21wYXQuYzoKLQlVc2UgUEFSQU1TIGluc3RlYWQgb2YgX19QLiAgU3VnZ2VzdGVkIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1UdWUgRGVjICA1IDExOjM5OjE0IDE5OTUgIExhcnJ5IFNjaHdpbW1lciAgPHJvc2VidWRAY3ljbG9uZS5zdGFuZm9yZC5lZHU+Ci0KLQkqIGxpYmdldHRleHQuaDogVXNlIGAjaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpJyBpbnN0ZWFkIG9mIGAjaWYKLQkhX0xJQklOVExfSCcgYmVjYXVzZSBTb2xhcmlzIGRlZmluZXMgX0xJQklOVExfSCBhcyBlbXB0eS4KLQotTW9uIERlYyAgNCAxNTo0MjowNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOgotCUluc3RhbGwgbGliaW50bC5pbnN0IGluc3RlYWQgb2YgbGliaW50bC5oLmluc3RhbGwuCi0KLVNhdCBEZWMgIDIgMjI6NTE6MzggMTk5NSAgTWFyY3VzIERhbmllbHMgIDxtYXJjdXNAc3lzYy5wZHguZWR1PgotCi0JKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOgotCVJldmVyc2Ugb3JkZXIgaW4gd2hpY2ggZmlsZXMgYXJlIHRyaWVkIHlvdSBsb2FkLiAgRmlyc3QKLQl0cnkgbG9jYWwgZmlsZSwgd2hlbiB0aGlzIGZhaWxlZCBhYnNvbHV0ZSBwYXRoLgotCi1XZWQgTm92IDI5IDAyOjAzOjUzIDE5OTUgIE5lbHNvbiBILiBGLiBCZWViZSAgPGJlZWJlQG1hdGgudXRhaC5lZHU+Ci0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOiBBZGQgbWlzc2luZyB7IH0uCi0KLVN1biBOb3YgMjYgMTg6MjE6NDEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliaW50bC5pbnN0OiBBZGQgbWlzc2luZyBfX1AgZGVmaW5pdGlvbi4gIFJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotCSogTWFrZWZpbGUuaW46Ci0JQWRkIGR1bW15IGBhbGwnIGFuZCBgZHZpJyBnb2Fscy4gIFJlcG9ydGVkIGJ5IFRvbSBUcm9tZXkuCi0KLVNhdCBOb3YgMjUgMTY6MTI6MDEgMTk5NSAgRnJhbmMsb2lzIFBpbmFyZCAgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPgotCi0JKiBoYXNoLXN0cmluZy5oOiBDYXBpdGFsaXplIGFyZ3VtZW50cyBvZiBtYWNyb3MuCi0KLVNhdCBOb3YgMjUgMTI6MDE6MzYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IFByZXZlbnQgZmlsZXMgbmFtZXMgbG9uZ2VyIHRoYW4gMTMKLQljaGFyYWN0ZXJzLiAgbGliaW50bC5oLmdsaWJjLT5saWJpbnRsLmdsaWJjLAotCWxpYmludGwuaC5pbnN0YWxsLT5saWJpbnRsLmluc3QuICBSZXBvcnRlZCBieSBKb3NodWEgUi4gUG91bHNvbi4KLQotU2F0IE5vdiAyNSAxMTozMToxMiAxOTk1ICBFcmljIEJhY2t1cyAgPGVyaWNiQGxzaWQuaHAuY29tPgotCi0JKiBkY2dldHRleHQuYzogRml4IGJ1ZyBpbiBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzLgotCi1TYXQgTm92IDI1IDAyOjM1OjI3IDE5OTUgIE5lbHNvbiBILiBGLiBCZWViZSAgPGJlZWJlQG1hdGgudXRhaC5lZHU+Ci0KLQkqIGxpYmdldHRleHQuaDogU29sYXJpcyBjYyBkb2VzIG5vdCB1bmRlcnN0YW5kCi0JICNpZiAhU1lNQk9MMSAmJiAhU1lNQk9MMi4gIFNhZAlidXQgdHJ1ZS4KLQotVGh1IE5vdiAyMyAxNjoyMjoxNCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6Ci0JRml4IGZvciBtYWNoaW5lIHdpdGggPjMyIGJpdCBgdW5zaWduZWQgbG9uZydzLgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKToKLQlGaXggaG9ycmlibGUgYnVnIGluIGxvb3AgZm9yIGFsdGVybmF0aXZlIHRyYW5zbGF0aW9uLgotCi1UaHUgTm92IDIzIDAxOjQ1OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHBvMnRibC5zZWQuaW4sIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6Ci0JU29tZSBmdXJ0aGVyIHNpbXBsaWZpY2F0aW9ucyBpbiBtZXNzYWdlIG51bWJlciBnZW5lcmF0aW9uLgotCi1Nb24gTm92IDIwIDIxOjA4OjQzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmludGwuaC5nbGliYzogVXNlIF9fY29uc3QgaW5zdGVhZCBvZiBjb25zdCBpbiBwcm90b3R5cGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOgotCUluc3RhbGwgbGliaW50bC5oLmluc3RhbGwgaW5zdGVhZCBvZiBsaWJpbnRsLmguICBUaGlzCi0JaXMgYSBzdHJpcHBlZC1kb3duIHZlcnNpb24uICBTdWdnZXN0ZWQgYnkgUGV0ZXIgTWlsbGVyLgotCi0JKiBsaWJpbnRsLmguaW5zdGFsbCwgbGliaW50bC5oLmdsaWJjOiBJbml0aWFsIHJldmlzaW9uLgotCi0JKiBsb2NhbGVhbGlhcy5jIChfbmxfZXhwYW5kX2FsaWFzLCByZWFkX2FsaWFzX2ZpbGUpOgotCVByb3RlY3QgcHJvdG90eXBlcyBpbiB0eXBlIGNhc3RzIGJ5IF9fUC4KLQotVHVlIE5vdiAxNCAxNjo0Mzo1OCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBoYXNoLXN0cmluZy5oOiBDb3JyZWN0IHByb3RvdHlwZSBmb3IgaGFzaF9zdHJpbmcuCi0KLVN1biBOb3YgMTIgMTI6NDI6MzAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOiBBZGQgcHJvdG90eXBlLgotCi0JKiBnZXR0ZXh0UC5oOiBGaXggY29weXJpZ2h0LgotCShTV0FQKTogQWRkIHByb3RvdHlwZS4KLQotV2VkIE5vdiAgOCAyMjo1NjozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOiBGb3Jnb3Qgc2l6ZW9mLgotCUF2b2lkIGNhbGxpbmcgKnByaW50ZiBmdW5jdGlvbi4gIFRoaXMgaW50cm9kdWNlcyBhIGJpZyBvdmVyaGVhZC4KLQlQYXRjaCBieSBSb2xhbmQgTWNHcmF0aC4KLQotVHVlIE5vdiAgNyAxNDoyMTowOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMsIGNhdC1jb21wYXQuYzogV3JvbmcgaW5kZW50YXRpb24gaW4gI2lmIGZvciBzdHBjcHkuCi0KLQkqIGZpbmRkb21haW4uYyAoc3RwY3B5KToKLQlEZWZpbmUgc3Vic3RpdHV0aW9uIGZ1bmN0aW9uIGxvY2FsLiAgVGhlIG1hY3JvIHdhcyB0byBmbGFreS4KLQotCSogY2F0LWNvbXBhdC5jOiBGaXggdHlwby4KLQotCSogeG9wZW4tbXNnLnNlZCwgbGludXgtbXNnLnNlZDoKLQlXaGlsZSBicmluZ2luZyBtZXNzYWdlIG51bWJlciB0byByaWdodCBwbGFjZSBvbmx5IGFjY2VwdCBkaWdpdHMuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6IE5vdyB0aGF0IHRoZSBjb3VudGVyIGRvZXMgbm90IGhhdmUKLQlsZWFkaW5nIDBzIHdlIGRvbid0IG5lZWQgdG8gcmVtb3ZlIHRoZW0uICBSZXBvcnRlZCBieSBNYXJjdXMKLQlEYW5pZWxzLgotCi0JKiBNYWtlZmlsZS5pbiAoLi4vcG8vY2F0LWlkLXRibC5vKTogVXNlICQodG9wX3NyZGlyKSBpbgotCWRlcGVuZGVuY3kuICBSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogY2F0LWNvbXBhdC5jOiAoc3RwY3B5KSBbIV9MSUJDICYmICFIQVZFX1NUUENQWV06IERlZmluZSByZXBsYWNlbWVudC4KLQlHZW5lcmFsbHkgY2xlYW51cCB1c2luZyAjaWYgaW5zdGVhZCBvZiAjaWZuZGVmLgotCi0JKiBNYWtlZmlsZS5pbjogQ29ycmVjdCB0eXBvcyBpbiBjb21tZW50LiAgQnkgRnJhbmMsb2lzIFBpbmFyZC4KLQotTW9uIE5vdiAgNiAwMDoyNzowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1zcmMpOiBEb24ndCBpbnN0YWxsIGxpYmludGwuaCBhbmQgbGliaW50bC5hCi0JaWYgd2UgdXNlIGFuIGF2YWlsYWJsZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLgotCi1TdW4gTm92ICA1IDIyOjAyOjA4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmdldHRleHQuaDogRml4IHR5cG86IEhBVkVfQ0FUR0VUVFMgLT4gSEFWRV9DQVRHRVRTLiAgUmVwb3J0ZWQKLQlieSBGcmFuYyxvaXMgUGluYXJkLgotCi0JKiBsaWJnZXR0ZXh0Lmg6IFVzZSAjaWYgaW5zdGVhZCBvZiAjaWZkZWYvI2lmbmRlZi4KLQotCSogZmluZGRvbWFpbi5jOgotCUNvbW1lbnRzIGRlc2NyaWJpbmcgd2hhdCBoYXMgdG8gYmUgZG9uZSBzaG91bGQgc3RhcnQgd2l0aCBGSVhNRS4KLQotU3VuIE5vdiAgNSAxOTozODowMSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogU3BsaXQuICBVc2UgRElTVEZJTEVTIHdpdGggbm9ybWFsIG1lYW5pbmcuCi0JRElTVEZJTEVTLmNvbW1vbiBuYW1lcyB0aGUgZmlsZXMgY29tbW9uIHRvIGJvdGggZGlzdCBnb2Fscy4KLQlESVNURklMRVMuZ2V0dGV4dCBhcmUgdGhlIGZpbGVzIG9ubHkgZGlzdHJpYnV0ZWQgaW4gR05VIGdldHRleHQuCi0KLVN1biBOb3YgIDUgMTc6MzI6NTQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IENvcnJlY3Qgc2VhcmNoaW5nIGluIGRlcml2ZWQgbG9jYWxlcy4KLQlUaGlzIHdhcyBuZWNlc3Nhcnkgc2luY2UgYSBjaGFuZ2UgaW4gX25sX2ZpbmRfbXNnIHNldmVyYWwgd2Vla3MKLQlhZ28uICBJIHJlYWxseSBkb24ndCBrbm93IHRoaXMgaXMgc3RpbGwgbm90IGZpeGVkLgotCi1TdW4gTm92ICA1IDEyOjQzOjEyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvYWRtc2djYXQuYyAoX25sX2xvYWRfZG9tYWluKTogVGVzdCBmb3IgRklMRU5BTUUgPT0gTlVMTC4gIFRoaXMKLQltaWdodCBtYXJrIGEgc3BlY2lhbCBjb25kaXRpb24uCi0KLQkqIGZpbmRkb21haW4uYyAobWFrZV9lbnRyeV9yZWMpOiBEb24ndCBtYWtlIGlsbGVnYWwgZW50cnkgYXMgZGVjaWRlZC4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBTdXBwcmVzcyBlcnJvciBtZXNzYWdlIHdoZW4gbG4gZmFpbGVkLgotCUdldCBmaWxlcyBmcm9tICQoc3JjZGlyKSBleHBsaWNpdGx5LgotCi0JKiBsaWJnZXR0ZXh0LmggKGdldHRleHRfY29uc3QpOiBSZW5hbWUgdG8gZ2V0dGV4dF9ub29wLgotCi1GcmkgTm92ICAzIDA3OjM2OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAobWFrZV9lbnRyeV9yZWMpOgotCVByb3RlY3QgYWdhaW5zdCB3cm9uZyBsb2NhbGUgbmFtZXMgYnkgdGVzdGluZyBtYXNrLgotCi0JKiBsaWJnZXR0ZXh0LmggKGdldHRleHRfY29uc3QpOiBBZGQgbWFjcm8gZGVmaW5pdGlvbi4KLQlDYXBpdGFsaXplIG1hY3JvIGFyZ3VtZW50cy4KLQotVGh1IE5vdiAgMiAyMzoxNTo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JVGVzdCBmb3IgcG9pbnRlciAhPSBOVUxMIGJlZm9yZSBhY2Nlc3NpbmcgdmFsdWUuCi0JUmVwb3J0ZWQgYnkgVG9tIFRyb21leS4KLQotCSogZ2V0dGV4dC5jIChOVUxMKToKLQlEZWZpbmUgYXMgKHZvaWQqKTAgaW5zdGFkIG9mIDAuICBSZXBvcnRlZCBieSBGcmFuYyxvaXMgUGluYXJkLgotCi1Nb24gT2N0IDMwIDIxOjI4OjUyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHBvMnRibC5zZWQuaW46IFNlcmlvdXMgdHlwbyBidWcgZml4ZWQgYnkgSmltIE1leWVyaW5nLgotCi1TYXQgT2N0IDI4IDIzOjIwOjQ3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxpYmdldHRleHQuaDogRGlzYWJsZSBkY2dldHRleHQgb3B0aW1pemF0aW9uIGZvciBTb2xhcmlzIDIuMy4KLQotCSogbG9jYWxlYWxpYXMuYyAoYWxpYXNfY29tcGFyZSk6Ci0JUGV0ZXIgTWlsbGVyIHJlcG9ydGVkIHRoYXQgdG9sb3dlciBpbiBzb21lIHN5c3RlbXMgaXMKLQlldmVuIGR1bWJlciB0aGFuIEkgdGhvdWdodC4gIFByb3RlY3QgY2FsbCBieSBgaXN1cHBlcicuCi0KLUZyaSBPY3QgMjcgMjI6MjI6NTEgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGxpYmRpciwgaW5jbHVkZWRpcik6IE5ldyB2YXJpYWJsZXMuCi0JKGluc3RhbGwtc3JjKTogSW5zdGFsbCBsaWJpbnRsLmEgYW5kIGxpYmludGwuaCBpbiBjb3JyZWN0IGRpcnMuCi0KLUZyaSBPY3QgMjcgMjI6MDc6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKFNPVVJDRVMpOiBGaXggdHlwbzogaW50cmwuY29tcGF0LmMgLT4gaW50bC1jb21wYXQuYy4KLQotCSogcG8ydGJsLnNlZC5pbjogUGF0Y2ggZm9yIGJ1Z2d5IFNFRHMgYnkgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMuCi0KLQkqIGxvY2FsZWFsaWFzLmM6Ci0JRml4IHR5cG8gYW5kIHN1cGVyZmxvdXMgdGVzdC4gIFJlcG9ydGVkIGJ5IENocmlzdGlhbiB2b24gUm9xdWVzLgotCi1GcmkgT2N0ICA2IDExOjUyOjA1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlDb3JyZWN0IHNvbWUgcmVtYWluZGVyIGZyb20gdGhlIHByZS1DRU4gc3ludGF4LiAgTm93Ci0Jd2UgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IG51bWJlciBvZiBzdWNjZXNzb3JzIGFueW1vcmUuCi0KLVdlZCBTZXAgMjcgMjE6NDE6MTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IEFkZCBsaWJpbnRsLmguZ2xpYmMuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0LWxpYmMpOiBBZGQgZ29hbCBmb3IgcGFja2luZyBzb3VyY2VzIGZvciBnbGliYy4KLQkoQ09NU1JDUywgQ09NSERSUyk6IFNwbGl0dGVkIHRvIHNlcGFyYXRlIHNvdXJjZXMgc2hhcmVkIHdpdGggZ2xpYmMuCi0KLQkqIGxvYWRtc2djYXQuYzogRm9yZ2V0IHRvIGNvbnRpbnVlICNpZiBsaW5lLgotCi0JKiBsb2NhbGVhbGlhcy5jOgotCVtfTElCQ106IFJlbmFtZSBzdHJjYXNlY21wIHRvIF9fc3RyY2FzZWNtcCB0byBrZWVwIEFOU0kgQyBuYW1lCi0Jc3BhY2UgY2xlYW4uCi0KLQkqIGRjZ2V0dGV4dC5jLCBmaW5kZG9tYWluLmM6IEJldHRlciBjb21tZW50IHRvIGxhc3QgY2hhbmdlLgotCi0JKiBsb2FkbXNnY2F0LmM6Ci0JW19MSUJDXTogUmVuYW1lIGZzdGF0LCBvcGVuLCBjbG9zZSwgcmVhZCwgbW1hcCwgYW5kIG11bm1hcCB0bwotCV9fZnN0YXQsIF9fb3BlbiwgX19jbG9zZSwgX19yZWFkLCBfX21tYXAsIGFuZCBfX211bm1hcCByZXNwCi0JdG8ga2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KLQotCSogZmluZGRvbWFpbi5jOgotCVtfTElCQ106IFJlbmFtZSBzdHBjcHkgdG8gX19zdHBjcHkgdG8ga2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KLQotCSogZGNnZXR0ZXh0LmM6Ci0JW19MSUJDXTogUmVuYW1lIGdldGNlZCBhbmQgc3RwY3B5IHRvIF9fZ2V0Y3dkIGFuZCBfX3N0cGNweSByZXNwIHRvCi0Ja2VlcCBBTlNJIEMgbmFtZSBzcGFjZSBjbGVhbi4KLQotCSogbGliZ2V0dGV4dC5oOgotCUluY2x1ZGUgc3lzL3R5cGVzLmggZm9yIHRob3NlIG9sZCBTeXNWIHN5c3RlbXMgb3V0IHRoZXJlLgotCVJlcG9ydGVkIGJ5IEZyYW5jZXNjbyBQb3RvcnRpYC4KLQotCSogbG9hZG1zZ2NhdC5jICh1c2VfbW1hcCk6IERlZmluZSBpZiBjb21waWxlZCBmb3IgZ2xpYmMuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKLQl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogZmluZGRvbWFpbi5jOiBGaXggMiB0aW1lcyBkZWZpZW5kIC0+IGRlZmluZWQuCi0KLQkqIHRleHRkb21haW4uYzogSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbgotCWNvbXBpbGluZyBmb3IgZ2xpYmMuICBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCi0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGxvY2FsZWFsaWFzLmMsIGxvYWRtc2djYXQuYzogUHJlcGFyZSB0byBiZSBjb21waWxlZCBpbiBnbGliYy4KLQotCSogZ2V0dGV4dC5jOgotCUluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KLQlHZXQgTlVMTCBmcm9tIHN0ZGRlZi5oIGlmIHdlIGNvbXBpbGUgZm9yIGdsaWJjLgotCi0JKiBmaW5kZG9tYWluLmM6IEluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oIHdoZW4KLQljb21waWxpbmcgZm9yIGdsaWJjLiAgSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycwotCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBkY2dldHRleHQuYzogSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycyB1bmNvbmRpdGlvbmFsbHkKLQlpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBkZ2V0dGV4dC5jOiBJZiBjb21waWxlZCBpbiBnbGliYyBpbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mCi0JbGliZ2V0dGV4dC5oLgotCShsb2NhbGUuaCk6IERvbid0IHJlbHkgb24gSEFWRV9MT0NBTEVfSCB3aGVuIGNvbXBpbGluZyBmb3IgZ2xpYmMuCi0KLQkqIGRjZ2V0dGV4dC5jOiBJZiBjb21waWxlZCBpbiBnbGliYyBpbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mCi0JbGliZ2V0dGV4dC5oLgotCShnZXRjd2QpOiBEb24ndCByZWx5IG9uIEhBVkVfR0VUQ1dEIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KLQotCSogYmluZHRleHRkb20uYzoKLQlJZiBjb21waWxlZCBpbiBnbGliYyBpbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaC4KLQotTW9uIFNlcCAyNSAyMjoyMzowNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChfbmxfZXhwYW5kX2FsaWFzKTogRG9uJ3QgY2FsbCBic2VhcmNoIGlmIE5NQVAgPD0gMC4KLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6Ci0JU3RyaW5nIHVzZWQgaW4gcHV0ZW52IG11c3Qgbm90IGJlIHJlY3ljbGVkLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBsaWJnZXR0ZXh0LmggKF9fVVNFX0dOVV9HRVRURVhUKToKLQlBZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgR05VIGdldHRleHQKLQlsaWJyYXJ5LgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlGaXggYnVnIHdpdGggdGhlIHN0cmFuZ2Ugc3RwY3B5IHJlcGxhY2VtZW50LgotCVJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotU2F0IFNlcCAyMyAwODoyMzo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBjYXQtY29tcGF0LmM6IEluY2x1ZGUgPHN0cmluZy5oPiBmb3Igc3RwY3B5IHByb3RvdHlwZS4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlXaGlsZSBleHBhbmQgc3RyZHVwIGNvZGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGBjcCcgaGlkZWQKLQloaWdoZXIgbGV2ZWwgdmFyaWFibGUgd2l0aCBzYW1lIG5hbWUuICBSZW5hbWUgdG8gYHRwJy4KLQotCSogdGV4dGRvbWFpbi5jICh0ZXh0ZG9tYWluKToKLQlBdm9pZCB3YXJuaW5nIGJ5IHVzaW5nIHRlbXBvcmFyeSB2YXJpYWJsZSBpbiBzdHJkdXAgY29kZS4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBhcHBsaWNhdGlvbicuCi0KLVRodSBTZXAgMjEgMTU6NTE6NDQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAoYWxpYXNfY29tcGFyZSk6Ci0JVXNlIHN0cmNhc2VjbXAoKSBvbmx5IGlmIGF2YWlsYWJsZS4gIEVsc2UgdXNlCi0JaW1wbGVtZW50YXRpb24gaW4gcGxhY2UuCi0KLQkqIGludGwtY29tcGF0LmM6Ci0JV3JhcHBlciBmdW5jdGlvbnMgbm93IGNhbGwgKl9fIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIF9fKi4KLQotCSogbGliZ2V0dGV4dC5oOiBEZWNsYXJlIHByb3RvdHlwZXMgZm9yICpfXyBmdW5jdGlvbnMgaW5zdGVhZCBmb3IgX18qLgotCi0JKiBjYXQtY29tcGF0LmMsIGxvYWRtc2djYXQuYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQotCSogYmluZHRleHRkb20uYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQlSZW5hbWUgdG8gYmluZHRleHRkb21haW5fXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgotCi0JKiBkZ2V0dGV4dC5jOgotCVJlbmFtZSBmdW5jdGlvbiB0byBkZ2V0dGV4dF9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCi0KLQkqIGdldHRleHQuYzoKLQlEb24ndCB1c2UgeG1hbGxvYywgeHN0cmR1cCwgYW5kIHN0cGNweS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQKLQlvZiB0aGUgc3RhbmRhcmQgbGliYyBhbmQgc28gcHJldmVudCBsaWJpbnRsLmEgZnJvbSBiZWluZyB1c2VkCi0Jc3RhbmRhbG9uZS4KLQlGdW5jdGlvbnMgbm93IGNhbGxlZCBnZXR0ZXh0X18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KLQotCSogZGNnZXR0ZXh0LmMsIGxvY2FsZWFsaWFzLmMsIHRleHRkb21haW4uYywgZmluZGRvbWFpbi5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCi1TdW4gU2VwIDE3IDIzOjE0OjQ5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogQ29ycmVjdCBzb21lIGJ1Z3MgaW4gaGFuZGxpbmcgb2YgQ0VOIHN0YW5kYXJkCi0gCWxvY2FsZSBkZWZpbml0aW9ucy4KLQotVGh1IFNlcCAgNyAwMTo0OToyOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmM6IEltcGxlbWVudCBDRU4gc3ludGF4LgotCi0JKiBnZXR0ZXh0UC5oIChsb2FkZWRfZG9tYWluKTogRXh0ZW5kIG51bWJlciBvZiBzdWNjZXNzb3JzIHRvIDMxLgotCi1TYXQgQXVnIDE5IDE5OjI1OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGlhc3BhdGgpOiBSZW1vdmUgcGF0aCB0byBYMTEgbG9jYWxlIGRpci4KLQotCSogTWFrZWZpbGUuaW46IE1ha2UgaW5zdGFsbC1zcmMgZGVwZW5kIG9uIGluc3RhbGwuICBUaGlzIGhlbHBzCi0gCWdldHRleHQgdG8gaW5zdGFsbCB0aGUgc291cmNlcyBhbmQgb3RoZXIgcGFja2FnZXMgY2FuIHVzZSB0aGUKLSAJaW5zdGFsbCBnb2FsLgotCi1TYXQgQXVnIDE5IDE1OjE5OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluICh1bmluc3RhbGwpOiBSZW1vdmUgc3R1ZmYgaW5zdGFsbGVkIGJ5IGluc3RhbGwtc3JjLgotCi1UdWUgQXVnIDE1IDEzOjEzOjUzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIFZFUlNJT04uaW46IEluaXRpYWwgcmV2aXNpb24uCi0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOgotCUFkZCBWRVJTSU9OIGZpbGUuICBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGdldHRleHQsIGJ1dAotCWZvciBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGlzIGxpYnJhcnkuCi0KLVR1ZSBBdWcgMTUgMDY6MTY6NDQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZ2V0dGV4dFAuaCAoX25sX2ZpbmRfZG9tYWluKToKLQlOZXcgcHJvdG90eXBlIGFmdGVyIGNoYW5naW5nIHNlYXJjaCBzdHJhdGVneS4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCVdlIG5vdyB0cnkgb25seSB0byBmaW5kIGEgc3BlY2lmaWVkIGNhdGFsb2cuICBGYWxsIGJhY2sgdG8gb3RoZXIKLQljYXRhbG9ncyBsaXN0ZWQgaW4gdGhlIGxvY2FsZSBsaXN0IGlzIG5vdyBkb25lIGluIF9fZGNnZXR0ZXh0LgotCi0JKiBkY2dldHRleHQuYyAoX19kY2dldHRleHQpOgotCU5vdyB3ZSBwcm92aWRlIG1lc3NhZ2UgZmFsbCBiYWNrIGV2ZW4gdG8gZGlmZmVyZW50IGxhbmd1YWdlcy4KLQlJLmUuIGlmIGEgbWVzc2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIG9uZSBsYW5ndWFnZSBhbGwgdGhlIG90aGVyCi0gCWluIHRoZSBsb2NhbGUgbGlzdCBhIHRyaWVkLiAgRm9ybWVybHkgZmFsbCBiYWNrIHdhcyBvbmx5IHBvc3NpYmxlCi0gCXdpdGhpbiBvbmUgbGFuZ3VhZ2UuICBJbXBsZW1lbnRlZCBieSBtb3Zpbmcgb25lIGxvb3AgZnJvbQotIAlfbmxfZmluZF9kb21haW4gdG8gaGVyZS4KLQotTW9uIEF1ZyAxNCAyMzo0NTo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoZ2V0dGV4dHNyY2Rpcik6Ci0JRGlyZWN0b3J5IHdoZXJlIHNvdXJjZSBvZiBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGFyZSBtYWRlCi0JYXZhaWxhYmxlLgotCShJTlNUQUxMLCBJTlNUQUxMX0RBVEEpOiBQcm9ncmFtcyB1c2VkIGZvciBpbnN0YWxsaW5nIHNvdXJjZXMuCi0JKGdldHRleHQtc3JjKTogTmV3LiAgUnVsZSB0byBpbnN0YWxsIEdOVSBnZXR0ZXh0IHNvdXJjZXMgZm9yIHVzZSBpbgotCWdldHRleHRpemUgc2hlbGwgc2NyaXB0LgotCi1TdW4gQXVnIDEzIDE0OjQwOjQ4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvYWRtc2djYXQuYyAoX25sX2xvYWRfZG9tYWluKToKLQlVc2UgbW1hcCBmb3IgbG9hZGluZyBvbmx5IHdoZW4gbXVubWFwIGZ1bmN0aW9uIGlzCi0JYWxzbyBhdmFpbGFibGUuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRGVwZW5kIG9uIGBhbGwnIGdvYWwuCi0KLVdlZCBBdWcgIDkgMTE6MDQ6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlEbyBub3Qgb3ZlcndyaXRlICdcbicgd2hlbiB0ZXJtaW5hdGluZyBhbGlhcyB2YWx1ZSBzdHJpbmcuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JSGFuZGxlIGxvbmcgbGluZXMuICBJZ25vcmUgdGhlIHJlc3Qgbm90IGZpdHRpbmcgaW4KLQl0aGUgYnVmZmVyIGFmdGVyIHRoZSBpbml0aWFsIGBmZ2V0cycgY2FsbC4KLQotV2VkIEF1ZyAgOSAwMDo1NDoyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIChfbmxfbG9hZF9kb21haW4pOgotCUFkZCBwcm90b3R5cGUsIHJlcGxhY2luZyBwcm90b3R5cGUgZm9yIF9ubF9sb2FkX21zZ19jYXQuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlSZW1vdmUgdW5uZWVkZWQgdmFyaWFibGUgZmlsZW5hbWUgYW5kIGZpbGVuYW1lX2xlbi4KLQkoZXhwYW5kX2FsaWFzKTogUmVtb3ZlIHByb3RvdHlwZSBiZWNhdXNlIGZ1bmN0aW9ucyBkb2VzIG5vdAotIAlleGlzdCBhbnltb3JlLgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCUNoYW5nZSB0eXBlIG9mIGZuYW1lX2xlbiBwYXJhbWV0ZXIgdG8gaW50LgotCSh4bWFsbG9jKTogQWRkIHByb3RvdHlwZS4KLQotCSogbG9hZG1zZ2NhdC5jOiBCZXR0ZXIgcHJvdG90eXBlcyBmb3IgeG1hbGxvYy4KLQotVHVlIEF1ZyAgOCAyMjozMDozOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JQWxsb3cgYWxpYXMgbmFtZSB0byBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBmb3VyIGNvbXBvbmVudHMuCi0KLQkqIE1ha2VmaWxlLmluIChhbGlhc3BhdGgpOiBOZXcgdmFyaWFibGUuICBTZXQgdG8gcHJlbGltaW5hcnkgdmFsdWUuCi0JKFNPVVJDRVMpOiBBZGQgbG9jYWxlYWxpYXMuYy4KLQkoT0JKRUNUUyk6IEFkZCBsb2NhbGVhbGlhcy5vLgotCi0JKiBnZXR0ZXh0UC5oOiBBZGQgcHJvdG90eXBlIGZvciBfbmxfZXhwYW5kX2FsaWFzLgotCi0JKiBmaW5kZG9tYWluLmM6IEFsaWFzaW5nIGhhbmRsZWQgaW4gaW50bC9sb2NhbGVhbGlhcy5jLgotCi0JKiBsb2NhbGVhbGlhcy5jOiBBbGlhc2luZyBmb3IgbG9jYWxlIG5hbWVzLgotCi0JKiBiaW5kdGV4dGRvbS5jOiBCZXR0ZXIgcHJvdG90eXBlcyBmb3IgeG1hbGxvYyBhbmQgeHN0cmR1cC4KLQotTW9uIEF1ZyAgNyAyMzo0Nzo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogZ2V0dGV4dC5wZXJsIGlzIG5vdyBmb3VuZCBpbiBtaXNjLy4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6Ci0JQ29ycmVjdCBpbXBsZW1lbnRhdGlvbi4gIGRpcm5hbWUgcGFyYW1ldGVyIHdhcyBub3QgdXNlZC4KLQlSZXBvcnRlZCBieSBNYXJjdXMgRGFuaWVscy4KLQotCSogZ2V0dGV4dFAuaCAobG9hZGVkX2RvbWFpbik6Ci0JTmV3IGZpZWxkcyBgc3VjY2Vzc29yJyBhbmQgYGRlY2lkZWQnIGZvciBvbywgbGF6eQotCW1lc3NhZ2UgaGFuZGxpbmcgaW1wbGVtZW50YXRpb24uCi0KLQkqIGRjZ2V0dGV4dC5jOgotCUFkb3B0IGZvciBvbywgbGF6eSBtZXNzYWdlIGhhbmRsaWluZy4KLSAgCU5vdyB3ZSBjYW4gaW5oZXJpdCB0cmFuc2xhdGlvbnMgZnJvbSBsZXNzIHNwZWNpZmljIGxvY2FsZXMuCi0JKGZpbmRfbXNnKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBsb2FkbXNnY2F0LmMsIGZpbmRkb21haW4uYzoKLQlDb21wbGV0ZSByZXdyaXRlLiAgSW1wbGVtZW50IG9vLCBsYXp5IG1lc3NhZ2UgaGFuZGxpbmcgOi0pLgotICAJV2Ugbm93IGhhdmUgYW4gYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgTEFOR1VBR0UnIHdpdGgKLSAJYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBMQ19BTEwgZm9yIHRoZSBMQ19NRVNTQUdFIGxvY2FsZS4KLSAgCUhlcmUgd2UgY2FuIHNldCBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHNwZWNpZmljYXRpb25zIGVhY2gKLSAJb2YgdGhlIGZvcm0gYGxhbmd1YWdlW190ZXJyaXRvcnlbLmNvZGVzZXRdXVtAbW9kaWZpZXJdJy4KLQotU2F0IEF1ZyAgNSAwOTo1NTo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKHVuaXN0ZC5oKToKLQlJbmNsdWRlIHRvIGdldCBfUENfUEFUSF9NQVggZGVmaW5lZCBvbiBzeXN0ZW0gaGF2aW5nIGl0LgotCi1GcmkgQXVnICA0IDIyOjQyOjAwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoc3RwY3B5KTogSW5jbHVkZSBwcm90b3R5cGUuCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0KTogUmVtb3ZlIGBjb3B5aW5nIGluc3RlYWQnIG1lc3NhZ2UuCi0KLVdlZCBBdWcgIDIgMTg6NTI6MDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKElELCBUQUdTKTogRG8gbm90IHVzZSAkXi4KLQotVHVlIEF1ZyAgMSAyMDowNzoxMSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoVEFHUywgSUQpOiBVc2UgJF4gYXMgY29tbWFuZCBhcmd1bWVudC4KLQkoVEFHUyk6IEdpdmUgZXRhZ3MgLW8gb3B0aW9uIHQgd3JpdGUgdG8gY3VycmVudCBkaXJlY3RvcnksCi0gCW5vdCAkKHNyY2RpcikuCi0JKElEKTogVXNlICQoc3JjZGlyKSBpbnN0ZWFkIG9zICQodG9wX3NyY2Rpcikvc3JjLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgSUQuCi0KLVN1biBKdWwgMzAgMTE6NTE6NDYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGdudWxvY2FsZWRpcik6Ci0JTmV3IHZhcmlhYmxlLCBhbHdheXMgdXNpbmcgc2hhcmUvIGZvciBkYXRhIGRpcmVjdG9yeS4KLQkoREVGUyk6IEFkZCBHTlVMT0NBTEVESVIsIHVzZWQgaW4gZmluZGRvbWFpbi5jLgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOgotCVNldCB0byBHTlVMT0NBTEVESVIsIGJlY2F1c2UgaXQgYWx3YXlzIGhhcyB0byBwb2ludAotCXRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgR05VIGdldHRleHQgTGlicmFyeSB3cml0ZXMgaXQgdG8uCi0KLQkqIGludGwtY29tcGF0LmMgKHRleHRkb21haW4sIGJpbmR0ZXh0ZG9tYWluKToKLQlVbmRlZmluZSBtYWNyb3MgYmVmb3JlIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0KLVNhdCBKdWwgMjIgMDE6MTA6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oIChfTElCSU5UTF9IKToKLQlQcm90ZWN0IGRlZmluaXRpb24gaW4gY2FzZSB3aGVyZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYXMKLQlsaWJnZXR0ZXh0Lmggb24gU29sYXJpcyBtYWNoaW5lcy4gIEFkZCBjb21tZW50IGFib3V0IHRoaXMuCi0KLVdlZCBKdWwgMTkgMDI6MzY6NDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogaW50bC1jb21wYXQuYyAodGV4dGRvbWFpbik6IENvcnJlY3QgdHlwby4KLQotV2VkIEp1bCAxOSAwMTo1MTozNSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBkY2dldHRleHQuYyAoZGNnZXR0ZXh0KTogRnVuY3Rpb24gbm93IGNhbGxlZCBfX2RjZ2V0dGV4dC4KLQotCSogZGdldHRleHQuYyAoZGdldHRleHQpOiBOb3cgY2FsbGVkIF9fZGdldHRleHQgYW5kIGNhbGxzCi0gCV9fZGNnZXR0ZXh0LgotCi0JKiBnZXR0ZXh0LmMgKGdldHRleHQpOgotCUZ1bmN0aW9uIG5vdyBjYWxsZWQgX19nZXR0ZXh0IGFuZCBjYWxscyBfX2RnZXR0ZXh0LgotCi0JKiB0ZXh0ZG9tYWluLmMgKHRleHRkb21haW4pOiBGdW5jdGlvbiBub3cgY2FsbGVkIF9fdGV4dGRvbWFpbi4KLQotCSogYmluZHRleHRkb20uYyAoYmluZHRleHRkb21haW4pOiBGdW5jdGlvbiBub3cgY2FsbGVkCi0gCV9fYmluZHRleHRkb21haW4uCi0KLQkqIGludGwtY29tcGF0LmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLQkqIE1ha2VmaWxlLmluIChTT1VSQ0VTKTogQWRkIGludGwtY29tcGF0LmMuCi0JKE9CSkVDVFMpOiBXZSBhbHdheXMgY29tcGlsZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBmdW5jdGlvbnMuCi0gIAlPQkpFQ1RTIGNvbnRhaW5zIGFsbCBvYmplY3RzIGJ1dCBjYXQtY29tcGF0Lm8sIC4uL3BvL2NhdC1pZi10YmwubywKLSAJYW5kIGludGwtY29tcGF0Lm8uCi0gIAkoR0VUVE9CSlMpOiBDb250YWlucyBub3cgb25seSBpbnRsLWNvbXBhdC5vLgotCi0JKiBsaWJnZXR0ZXh0Lmg6Ci0JUmUtaW5jbHVkZSBwcm90ZWN0aW9uIG1hdGNoZXMgZHVhbGlzdGljIGNoYXJhY3RlciBvZiBsaWJnZXR0ZXh0LmguCi0JRm9yIGFsbCBmdW5jdGlvbnMgaW4gR05VIGdldHRleHQgbGlicmFyeSBkZWZpbmUgX18gY291bnRlciBwYXJ0LgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cmNocik6IERlZmluZSBhcyBpbmRleCBpZiBub3QgZm91bmQgaW4gQyBsaWJyYXJ5LgotCShfbmxfZmluZF9kb21haW4pOiBGb3IgcmVsYXRpdmUgcGF0aHMgcGFzdGUgLyBpbiBiZXR3ZWVuLgotCi1UdWUgSnVsIDE4IDE2OjM3OjQ1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvYWRtc2djYXQuYywgZmluZGRvbWFpbi5jOiBBZGQgaW5jbHVzaW9uIG9mIHN5cy90eXBlcy5oLgotCi0JKiB4b3Blbi1tc2cuc2VkOiBGaXggYnVnIHdpdGggYG1zZ3N0ciAiIicgbGluZXMuCi0JQSBsaXR0bGUgYml0IGJldHRlciBjb21tZW50cy4KLQotVHVlIEp1bCAxOCAwMToxODoyNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbjoKLQlwby1tb2RlLmVsLCBtYWtlbGlua3MsIGNvbWJpbmUtc2ggYXJlIG5vdyBmb3VuZCBpbiAuLi9taXNjLgotCi0JKiBwby1tb2RlLmVsLCBtYWtlbGlua3MsIGNvbWJpbmUtc2gsIGVsaXNwLWNvbXA6Ci0JTW92ZWQgdG8gLi4vbWlzYy8uCi0KLQkqIGxpYmdldHRleHQuaCwgZ2V0dGV4dFAuaCwgZ2V0dGV4dC5oOiBVbmlmb3JtIHRlc3QgZm9yIF9fU1REQ19fLgotCi1TdW4gSnVsIDE2IDIyOjMzOjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMLCBJTlNUQUxMX0RBVEEpOiBOZXcgdmFyaWFibGVzLgotCShpbnN0YWxsLWRhdGEsIHVuaW5zdGFsbCk6IEluc3RhbGwvdW5pbnN0YWxsIC5lbGMgZmlsZS4KLQotCSogcG8tbW9kZS5lbCAoSW5zdGFsbGF0aW9uIGNvbW1lbnQpOgotCUFkZCAucG94IGFzIHBvc3NpYmxlIGV4dGVuc2lvbiBvZiAucG8gZmlsZXMuCi0KLVN1biBKdWwgMTYgMTM6MjM6MjcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZWxpc3AtY29tcDogQ29tcGxldGUgbmV3IHZlcnNpb24gYnkgRnJhbmMsb2lzOiBUaGlzIGRvZXMgbm90Ci0gCWZhaWwgd2hlbiBub3QgY29tcGlsaW5nIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotCi1TdW4gSnVsIDE2IDAwOjEyOjE3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluICguLi9wby9jYXQtaWQtdGJsLm8pOgotCVVzZSAkKE1BS0UpIGluc3RlYWQgb2YgbWFrZSBmb3IgcmVjdXJzaXZlIG1ha2UuCi0KLQkqIE1ha2VmaWxlLmluICguZWwuZWxjKTogVXNlICQoU0hFTEwpIGluc3RlYWQgb2YgL2Jpbi9zaC4KLQkoaW5zdGFsbC1leGVjKTogQWRkIG1pc3NpbmcgZHVtbXkgZ29hbC4KLQkoaW5zdGFsbC1kYXRhLCB1bmluc3RhbGwpOiBAIGluIG11bHRpLWxpbmUgc2hlbGwgY29tbWFuZCBhdAotIAliZWdpbm5pbmcsIG5vdCBpbiBmcm9udCBvZiBlY2hvLiAgUmVwb3J0ZWQgYnkgRXJpYyBCYWNrdXMuCi0KLVNhdCBKdWwgMTUgMDA6MjE6MjggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6Ci0JUmVuYW1lIGxpYmdldHRleHQucGVybCB0byBnZXR0ZXh0LnBlcmwgdG8gZml0IGluIDE0IGNoYXJzCi0JZmlsZSBzeXN0ZW1zLgotCi0JKiBnZXR0ZXh0LnBlcmw6Ci0gCVJlbmFtZSB0byBnZXR0ZXh0LnBlcmwgdG8gZml0IGluIDE0IGNoYXJzIGZpbGUgc3lzdGVtcy4KLQotVGh1IEp1bCAxMyAyMzoxNzoyMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBjYXQtY29tcGF0LmM6IElmICFTVERDX0hFQURFUlMgdHJ5IHRvIGluY2x1ZGUgbWFsbG9jLmguCi0KLVRodSBKdWwgMTMgMjA6NTU6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbjogUHJldHR5IHByaW50aW5nLgotCi0JKiBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOgotCUNvcnJlY3QgYnVncyB3aXRoIGhhbmRsaW5nIHN1YnN0aXR1dGUgZmxhZ3MgaW4gYnJhbmNoZXMuCi0KLQkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKToKLQlPbGQgSyZSIGNvbXBpbGVycyBkb24ndCB1bmRlciBzdGFuZCBgdW5zaWduZWQgY2hhcicuCi0KLQkqIGdldHRleHQuaCAobmxzX3VpbnQzMik6Ci0JU29tZSBvbGQgSyZSIGNvbXBpbGVycyAoZWcgSFApIGRvbid0IHVuZGVyc3RhbmQgYHVuc2lnbmVkIGludCcuCi0KLQkqIGNhdC1jb21wYXQuYyAobXNnX3RvX2NhdF9pZCk6IERlLUFOU0ktZnkgcHJvdG90eXBlcy4KLQotVGh1IEp1bCAxMyAwMTozNDozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRUxDRklMRVMpOiBOZXcgdmFyaWFibGUuCi0JKERJU1RGSUxFUyk6IEFkZCBlbGlzcC1jb21wLgotCUFkZCBpbXBsaWNpdCBydWxlIGZvciAuZWwgLT4gLmVsYyBjb21waWxhdGlvbi4KLQkoaW5zdGFsbC1kYXRhKTogaW5zdGFsbCAkRUxDRklMRVMKLQkoY2xlYW4pOiByZW5hbWVkIHBvLXRvLXRibCBhbmQgcG8tdG8tbXNnIHRvIHBvMnRibCBhbmQgcG8ybXNnIHJlc3AuCi0KLQkqIGVsaXNwLWNvbXA6IEluaXRpYWwgcmV2aXNpb24KLQotV2VkIEp1bCAxMiAxNjoxNDo1MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbjoKLQljYXQtaWQtdGJsLmMgaXMgbm93IGZvdW5kIGluIHBvLy4gIFRoaXMgZW5hYmxlcyB1cyB0byB1c2UgYW4gaWRlbnRpY2FsCi0JaW50bC8gZGlyZWN0b3J5IGluIGFsbCBwYWNrYWdlcy4KLQotCSogZGNnZXR0ZXh0LmMgKGRjZ2V0dGV4dCk6IGhhc2hpbmcgZG9lcyBub3Qgd29yayBmb3IgdGFibGUgc2l6ZSA8PSAyLgotCi0JKiB0ZXh0ZG9tYWluLmM6IGZpeCB0eXBvICgjaWYgZGVmIC0+ICNpZiBkZWZpbmVkKQotCi1UdWUgSnVsIDExIDE4OjQ0OjQzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1jYXQtaWQpOiB1c2UgdG9wX3NyY2RpciB0byBhZGRyZXNzIHNvdXJjZSBmaWxlcwotCShESVNURklMRVMsZGlzdGNsZWFuKTogbW92ZSB0dXBkYXRlLnBlcmwgdG8gc3JjLwotCi0JKiBwby10by10Ymwuc2VkLmluOgotCWFkZCBhZGRpdGlvbmFsIGp1bXAgdG8gY2xlYXIgY2hhbmdlIGZsYWcgdG8gcmVjb2duaXplIG11bHRpbGluZSBzdHJpbmdzCi0KLVR1ZSBKdWwgMTEgMDE6MzI6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogdGV4dGRvbWFpbi5jOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBzdGRsaWIuaCBhbmQgc3RyaW5nLmguCi0KLQkqIGxvYWRtc2djYXQuYzogUHJvdGVjdCBpbmNsdXNpb24gb2Ygc3RkbGliLmguCi0KLQkqIGxpYmdldHRleHQuaDogUHJvdGVjdCBpbmNsdXNpb24gb2YgbG9jYWxlLmguCi0JQWxsb3cgdXNlIGluIEMrKyBwcm9ncmFtcy4KLQlEZWZpbmUgTlVMTCBpcyBub3QgaGFwcGVuZWQgYWxyZWFkeS4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6IHNoaXAgcG8tdG8tdGJsLnNlZC5pbiBpbnN0ZWFkIG9mCi0JcG8tdG8tdGJsLnNlZC4KLQkoZGlzdGNsZWFuKTogcmVtb3ZlIHBvLXRvLXRibC5zZWQgYW5kIHR1cGRhdGUucGVybC4KLQotCSogdHVwZGF0ZS5wZXJsLmluOiBTdWJzdGl0dXRlIFBlcmwgcGF0aCBldmVuIGluIGV4ZWMgbGluZS4KLQlEb24ndCBpbmNsdWRlIGVudHJpZXMgd2l0aG91dCB0cmFuc2xhdGlvbiBmcm9tIG9sZCAucG8gZmlsZS4KLQotVHVlIEp1bCAgNCAwMDo0MTo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IHVzZSAiVXBkYXRlZDogIiBpbiBtc2dpZCAiIi4KLQotCSogY2F0LWNvbXBhdC5jOiBGaXggdHlwbyAoTE9DQUxESVIgLT4gTE9DQUxFRElSKS4KLSAJRGVmaW5lIGdldGVudiBpZiAhX19TVERDX18uCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IFByb3RlY3Qgc3RkbGliLmggYW5kIHN0cmluZy5oIGluY2x1c2lvbi4KLSAJRGVmaW5lIGZyZWUgaWYgIV9fU1REQ19fLgotCi0JKiBmaW5kZG9tYWluLmM6IENoYW5nZSBERUZfTVNHX0RPTV9ESVIgdG8gTE9DQUxFRElSLgotIAlEZWZpbmUgZnJlZSBpZiAhX19TVERDX18uCi0KLQkqIGNhdC1jb21wYXQuYzogQ2hhbmdlIERFRl9NU0dfRE9NX0RJUiB0byBMT0NBTEVESVIuCi0KLU1vbiBKdWwgIDMgMjM6NTY6MzAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW46IFVzZSBMT0NBTEVESVIgaW5zdGVhZCBvZiBERUZfTVNHX0RPTV9ESVIuCi0JUmVtb3ZlIHVubmVlZGVkICQoc3JjZGlyKSBmcm9tIE1ha2VmaWxlLmluIGRlcGVuZGVuY3kuCi0KLQkqIG1ha2VsaW5rczogQWRkIGNvcHlyaWdodCBhbmQgc2hvcnQgZGVzY3JpcHRpb24uCi0KLQkqIHBvLW1vZGUuZWw6IExhc3QgdmVyc2lvbiBmb3IgMC43LgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IEZpeCBkaWUgbWVzc2FnZS4KLQotCSogZGNnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdHJpbmcuaC4KLQotCSogZ2V0dGV4dC5jOiBQcm90ZWN0IGluY2x1ZGUgb2Ygc3RkbGliLmggYW5kIGZ1cnRoZXIgdHJpZXMgdG8gZ2V0IE5VTEwuCi0KLQkqIGZpbmRkb21haW4uYzogU29tZSBjb3JyZWN0aW9ucyBpbiBpbmNsdWRlcy4KLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogUHJ1bmUgbGlzdCBjb3JyZWN0IHBhdGggdG8gTWFrZWZpbGUuaW4uCi0KLQkqIHBvLXRvLXRibC5zZWQ6IEFkb3B0IGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgotCi0JKiBsaW51eC1tc2cuc2VkLCB4b3Blbi1tc2cuc2VkOiBBZG9wdCBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KLQotU3VuIEp1bCAgMiAyMzo1NTowMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IENvbXBsZXRlIHJld3JpdGUgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCisyMDA0LTAxLTI5ICBHTlUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KIAotU3VuIEp1bCAgMiAwMjowNjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgorCSogVmVyc2lvbiAwLjE0LjEgcmVsZWFzZWQuCiAKLQkqIEZpcnN0IG9mZmljaWFsIHJlbGVhc2UuICBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhbGwgdGhlIGNvZGUKLQluZWVkZWQgdG8gaW50ZXJuYXRpb25hbGl6ZSBvd24gcGFja2FnZXMuICBJdCBwcm92aWRlcyBmdW5jdGlvbnMKLQl3aGljaCBhbGxvdyB0byB1c2UgdGhlIFgvT3BlbiBjYXRnZXRzIGZ1bmN0aW9uIHdpdGggYW4gaW50ZXJmYWNlCi0JbGlrZSB0aGUgVW5pZm9ydW0gZ2V0dGV4dCBmdW5jdGlvbi4gIEZvciBzeXN0ZW0gd2hpY2ggZG9lcyBub3QKLQloYXZlIG5laXRoZXIgb2YgdGhvc2UgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZC4KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2NvbmZpZy5jaGFyc2V0CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvY29uZmlnLmNoYXJzZXQJMjAwNC0wOS0xMiAxNDo0MDozNC4zNTQ3NDgyNDAgLTA0MDAKQEAgLTAsMCArMSw2MDggQEAKKyMhIC9iaW4vc2gKKyMgT3V0cHV0IGEgc3lzdGVtIGRlcGVuZGVudCB0YWJsZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYWxpYXNlcy4KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjICAgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyAgIFVTQS4KKyMKKyMgVGhlIHRhYmxlIGNvbnNpc3RzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCisjICAgIEFMSUFTICBDQU5PTklDQUwKKyMKKyMgQUxJQVMgaXMgdGhlIChzeXN0ZW0gZGVwZW5kZW50KSByZXN1bHQgb2YgIm5sX2xhbmdpbmZvIChDT0RFU0VUKSIuCisjIEFMSUFTIGlzIGNvbXBhcmVkIGluIGEgY2FzZSBzZW5zaXRpdmUgd2F5LgorIworIyBDQU5PTklDQUwgaXMgdGhlIEdOVSBjYW5vbmljYWwgbmFtZSBmb3IgdGhpcyBjaGFyYWN0ZXIgZW5jb2RpbmcuCisjIEl0IG11c3QgYmUgYW4gZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IGxpYmljb252LiBTdXBwb3J0IGJ5IEdOVSBsaWJjIGlzCisjIGFsc28gZGVzaXJhYmxlLiBDQU5PTklDQUwgaXMgY2FzZSBpbnNlbnNpdGl2ZS4gVXN1YWxseSBhbiB1cHBlciBjYXNlCisjIE1JTUUgY2hhcnNldCBuYW1lIGlzIHByZWZlcnJlZC4KKyMgVGhlIGN1cnJlbnQgbGlzdCBvZiBHTlUgY2Fub25pY2FsIGNoYXJzZXQgbmFtZXMgaXMgYXMgZm9sbG93cy4KKyMKKyMgICAgICAgbmFtZSAgICAgICAgICAgICAgTUlNRT8gICAgICAgICAgICAgdXNlZCBieSB3aGljaCBzeXN0ZW1zCisjICAgQVNDSUksIEFOU0lfWDMuNC0xOTY4ICAgICAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBJU08tODg1OS0xICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTIgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSVNPLTg4NTktMyAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMKKyMgICBJU08tODg1OS00ICAgICAgICAgICAgICBZICAgb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBJU08tODg1OS01ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTYgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBzb2xhcmlzCisjICAgSVNPLTg4NTktNyAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKKyMgICBJU08tODg1OS04ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKKyMgICBJU08tODg1OS05ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcworIyAgIElTTy04ODU5LTEzICAgICAgICAgICAgICAgICBnbGliYworIyAgIElTTy04ODU5LTE0ICAgICAgICAgICAgICAgICBnbGliYworIyAgIElTTy04ODU5LTE1ICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgZnJlZWJzZAorIyAgIEtPSTgtUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgS09JOC1VICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGZyZWVic2QgZGFyd2luCisjICAgS09JOC1UICAgICAgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgQ1A0MzcgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQNzc1ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg1MCAgICAgICAgICAgICAgICAgICAgICAgYWl4IG9zZiBkb3MKKyMgICBDUDg1MiAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NTUgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODU2ICAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDg1NyAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjEgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODYyICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg2NCAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjUgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODY2ICAgICAgICAgICAgICAgICAgICAgICBmcmVlYnNkIGRhcndpbiBkb3MKKyMgICBDUDg2OSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NzQgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcworIyAgIENQOTIyICAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDkzMiAgICAgICAgICAgICAgICAgICAgICAgYWl4IHdvZTMyIGRvcworIyAgIENQOTQzICAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDk0OSAgICAgICAgICAgICAgICAgICAgICAgb3NmIHdvZTMyIGRvcworIyAgIENQOTUwICAgICAgICAgICAgICAgICAgICAgICB3b2UzMiBkb3MKKyMgICBDUDEwNDYgICAgICAgICAgICAgICAgICAgICAgYWl4CisjICAgQ1AxMTI0ICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQMTEyNSAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDExMjkgICAgICAgICAgICAgICAgICAgICAgYWl4CisjICAgQ1AxMjUwICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjUxICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMgZGFyd2luIHdvZTMyCisjICAgQ1AxMjUyICAgICAgICAgICAgICAgICAgICAgIGFpeCB3b2UzMgorIyAgIENQMTI1MyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIENQMTI1NCAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIENQMTI1NSAgICAgICAgICAgICAgICAgICAgICBnbGliYyB3b2UzMgorIyAgIENQMTI1NiAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIENQMTI1NyAgICAgICAgICAgICAgICAgICAgICB3b2UzMgorIyAgIEdCMjMxMiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBFVUMtSlAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEVVQy1LUiAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgRVVDLVRXICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMKKyMgICBCSUc1ICAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBCSUc1LUhLU0NTICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcworIyAgIEdCSyAgICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBhaXggb3NmIHNvbGFyaXMgd29lMzIgZG9zCisjICAgR0IxODAzMCAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMKKyMgICBTSElGVF9KSVMgICAgICAgICAgICAgICBZICAgaHB1eCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEpPSEFCICAgICAgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzIHdvZTMyCisjICAgVElTLTYyMCAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBocHV4IG9zZiBzb2xhcmlzCisjICAgVklTQ0lJICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjCisjICAgVENWTjU3MTItMSAgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgR0VPUkdJQU4tUFMgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgSFAtUk9NQU44ICAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBIUC1BUkFCSUM4ICAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLUdSRUVLOCAgICAgICAgICAgICAgICAgICBocHV4CisjICAgSFAtSEVCUkVXOCAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBIUC1UVVJLSVNIOCAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLUtBTkE4ICAgICAgICAgICAgICAgICAgICBocHV4CisjICAgREVDLUtBTkpJICAgICAgICAgICAgICAgICAgIG9zZgorIyAgIERFQy1IQU5ZVSAgICAgICAgICAgICAgICAgICBvc2YKKyMgICBVVEYtOCAgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKKyMKKyMgTm90ZTogTmFtZXMgd2hpY2ggYXJlIG5vdCBtYXJrZWQgYXMgYmVpbmcgYSBNSU1FIG5hbWUgc2hvdWxkIG5vdCBiZSB1c2VkIGluCisjIEludGVybmV0IHByb3RvY29scyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2UgKG1haWwsIG5ld3MsIGV0Yy4pLgorIworIyBOb3RlOiBBU0NJSSBhbmQgQU5TSV9YMy40LTE5NjggYXJlIHN5bm9ueW1vdXMgY2Fub25pY2FsIG5hbWVzLiBBcHBsaWNhdGlvbnMKKyMgbXVzdCB1bmRlcnN0YW5kIGJvdGggbmFtZXMgYW5kIHRyZWF0IHRoZW0gYXMgZXF1aXZhbGVudC4KKyMKKyMgVGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIGZpbGUgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHNwZWNpZmljYXRpb24sCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yCisjICAgIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTQorCitob3N0PSIkMSIKK29zPWBlY2hvICIkaG9zdCIgfCBzZWQgLWUgJ3MvXlteLV0qLVteLV0qLVwoLipcKSQvXDEvJ2AKK2VjaG8gIiMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFibGUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFsaWFzZXMsIgorZWNobyAiIyBzdWl0YWJsZSBmb3Igb3BlcmF0aW5nIHN5c3RlbSAnJHtvc30nLiIKK2VjaG8gIiMgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gY29uZmlnLmNoYXJzZXQuIgorIyBMaXN0IG9mIHJlZmVyZW5jZXMsIHVwZGF0ZWQgZHVyaW5nIGluc3RhbGxhdGlvbjoKK2VjaG8gIiMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAiCitjYXNlICIkb3MiIGluCisgICAgbGludXgtZ251bGliYzEqKQorCSMgTGludXggbGliYzUgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwllY2hvICJDIEFTQ0lJIgorCWVjaG8gIlBPU0lYIEFTQ0lJIgorCWZvciBsIGluIGFmIGFmX1pBIGNhIGNhX0VTIGRhIGRhX0RLIGRlIGRlX0FUIGRlX0JFIGRlX0NIIGRlX0RFIGRlX0xVIFwKKwkgICAgICAgICBlbiBlbl9BVSBlbl9CVyBlbl9DQSBlbl9ESyBlbl9HQiBlbl9JRSBlbl9OWiBlbl9VUyBlbl9aQSBcCisJICAgICAgICAgZW5fWlcgZXMgZXNfQVIgZXNfQk8gZXNfQ0wgZXNfQ08gZXNfRE8gZXNfRUMgZXNfRVMgZXNfR1QgXAorCSAgICAgICAgIGVzX0hOIGVzX01YIGVzX1BBIGVzX1BFIGVzX1BZIGVzX1NWIGVzX1VTIGVzX1VZIGVzX1ZFIGV0IFwKKwkgICAgICAgICBldF9FRSBldSBldV9FUyBmaSBmaV9GSSBmbyBmb19GTyBmciBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBcCisJICAgICAgICAgZnJfTFUgZ2EgZ2FfSUUgZ2wgZ2xfRVMgaWQgaWRfSUQgaW4gaW5fSUQgaXMgaXNfSVMgaXQgaXRfQ0ggXAorCSAgICAgICAgIGl0X0lUIGtsIGtsX0dMIG5sIG5sX0JFIG5sX05MIG5vIG5vX05PIHB0IHB0X0JSIHB0X1BUIHN2IFwKKwkgICAgICAgICBzdl9GSSBzdl9TRTsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5pc28tODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5pc28tODg1OS0xNSBJU08tODg1OS0xNSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTE1QGV1cm8gSVNPLTg4NTktMTUiCisJICBlY2hvICIkbEBldXJvIElTTy04ODU5LTE1IgorCSAgZWNobyAiJGwuY3AtNDM3IENQNDM3IgorCSAgZWNobyAiJGwuY3AtODUwIENQODUwIgorCSAgZWNobyAiJGwuY3AtMTI1MiBDUDEyNTIiCisJICBlY2hvICIkbC5jcC0xMjUyQGV1cm8gQ1AxMjUyIgorCSAgI2VjaG8gIiRsLmF0YXJpLXN0IEFUQVJJLVNUIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gY3MgY3NfQ1ogaHIgaHJfSFIgaHUgaHVfSFUgcGwgcGxfUEwgcm8gcm9fUk8gc2sgc2tfU0sgc2wgXAorCSAgICAgICAgIHNsX1NJIHNyIHNyX0NTIHNyX1lVOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktMiIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTIgSVNPLTg4NTktMiIKKwkgIGVjaG8gIiRsLmNwLTg1MiBDUDg1MiIKKwkgIGVjaG8gIiRsLmNwLTEyNTAgQ1AxMjUwIgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCWZvciBsIGluIG1rIG1rX01LIHJ1IHJ1X1JVOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktNSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTUgSVNPLTg4NTktNSIKKwkgIGVjaG8gIiRsLmtvaTgtciBLT0k4LVIiCisJICBlY2hvICIkbC5jcC04NjYgQ1A4NjYiCisJICBlY2hvICIkbC5jcC0xMjUxIENQMTI1MSIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBhciBhcl9TQTsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTYiCisJICBlY2hvICIkbC5pc28tODg1OS02IElTTy04ODU5LTYiCisJICBlY2hvICIkbC5jcC04NjQgQ1A4NjQiCisJICAjZWNobyAiJGwuY3AtODY4IENQODY4IiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcKKwkgIGVjaG8gIiRsLmNwLTEyNTYgQ1AxMjU2IgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCWZvciBsIGluIGVsIGVsX0dSIGdyIGdyX0dSOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktNyIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTcgSVNPLTg4NTktNyIKKwkgIGVjaG8gIiRsLmNwLTg2OSBDUDg2OSIKKwkgIGVjaG8gIiRsLmNwLTEyNTMgQ1AxMjUzIgorCSAgZWNobyAiJGwuY3AtMTI1M0BldXJvIENQMTI1MyIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCSAgZWNobyAiJGwudXRmLThAZXVybyBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gaGUgaGVfSUwgaXcgaXdfSUw7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS04IgorCSAgZWNobyAiJGwuaXNvLTg4NTktOCBJU08tODg1OS04IgorCSAgZWNobyAiJGwuY3AtODYyIENQODYyIgorCSAgZWNobyAiJGwuY3AtMTI1NSBDUDEyNTUiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gdHIgdHJfVFI7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS05IgorCSAgZWNobyAiJGwuaXNvLTg4NTktOSBJU08tODg1OS05IgorCSAgZWNobyAiJGwuY3AtODU3IENQODU3IgorCSAgZWNobyAiJGwuY3AtMTI1NCBDUDEyNTQiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gbHQgbHRfTFQgbHYgbHZfTFY7IGRvCisJICAjZWNobyAiJGwgQkFMVElDIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKKwkgIGVjaG8gIiRsIElTTy04ODU5LTEzIgorCWRvbmUKKwlmb3IgbCBpbiBydV9VQSB1ayB1a19VQTsgZG8KKwkgIGVjaG8gIiRsIEtPSTgtVSIKKwlkb25lCisJZm9yIGwgaW4gemggemhfQ047IGRvCisJICAjZWNobyAiJGwgR0JfMjMxMi04MCIgIyBub3QgYSBjb21tb25seSB1c2VkIGVuY29kaW5nLCB3cm9uZyBlbmNvZGluZyBuYW1lCisJICBlY2hvICIkbCBHQjIzMTIiCisJZG9uZQorCWZvciBsIGluIGphIGphX0pQIGphX0pQLkVVQzsgZG8KKwkgIGVjaG8gIiRsIEVVQy1KUCIKKwlkb25lCisJZm9yIGwgaW4ga28ga29fS1I7IGRvCisJICBlY2hvICIkbCBFVUMtS1IiCisJZG9uZQorCWZvciBsIGluIHRoIHRoX1RIOyBkbworCSAgZWNobyAiJGwgVElTLTYyMCIKKwlkb25lCisJZm9yIGwgaW4gZmEgZmFfSVI7IGRvCisJICAjZWNobyAiJGwgSVNJUkktMzM0MiIgIyBhIGJyb2tlbiBlbmNvZGluZworCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCTs7CisgICAgbGludXgqIHwgKi1nbnUqKQorCSMgV2l0aCBnbGliYy0yLjEgb3IgbmV3ZXIsIHdlIGRvbid0IG5lZWQgYW55IGNhbm9uaWNhbGl6YXRpb24sCisJIyBiZWNhdXNlIGdsaWJjIGhhcyBpY29udiBhbmQgYm90aCBnbGliYyBhbmQgbGliaWNvbnYgc3VwcG9ydCBhbGwKKwkjIEdOVSBjYW5vbmljYWwgbmFtZXMgZGlyZWN0bHkuIFRoZXJlZm9yZSwgdGhlIE1ha2VmaWxlIGRvZXMgbm90CisJIyBuZWVkIHRvIGluc3RhbGwgdGhlIGFsaWFzIGZpbGUgYXQgYWxsLgorCSMgVGhlIGZvbGxvd2luZyBhcHBsaWVzIG9ubHkgdG8gZ2xpYmMtMi4wLnggYW5kIG9sZGVyIGxpYmNzLgorCWVjaG8gIklTT182NDYuSVJWOjE5ODMgQVNDSUkiCisJOzsKKyAgICBhaXgqKQorCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgorCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgorCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgorCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgorCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgorCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCisJZWNobyAiSUJNLTg1MCBDUDg1MCIKKwllY2hvICJJQk0tODU2IENQODU2IgorCWVjaG8gIklCTS05MjEgSVNPLTg4NTktMTMiCisJZWNobyAiSUJNLTkyMiBDUDkyMiIKKwllY2hvICJJQk0tOTMyIENQOTMyIgorCWVjaG8gIklCTS05NDMgQ1A5NDMiCisJZWNobyAiSUJNLTEwNDYgQ1AxMDQ2IgorCWVjaG8gIklCTS0xMTI0IENQMTEyNCIKKwllY2hvICJJQk0tMTEyOSBDUDExMjkiCisJZWNobyAiSUJNLTEyNTIgQ1AxMjUyIgorCWVjaG8gIklCTS1ldWNDTiBHQjIzMTIiCisJZWNobyAiSUJNLWV1Y0pQIEVVQy1KUCIKKwllY2hvICJJQk0tZXVjS1IgRVVDLUtSIgorCWVjaG8gIklCTS1ldWNUVyBFVUMtVFciCisJZWNobyAiYmlnNSBCSUc1IgorCWVjaG8gIkdCSyBHQksiCisJZWNobyAiVElTLTYyMCBUSVMtNjIwIgorCWVjaG8gIlVURi04IFVURi04IgorCTs7CisgICAgaHB1eCopCisJZWNobyAiaXNvODg1OTEgSVNPLTg4NTktMSIKKwllY2hvICJpc284ODU5MiBJU08tODg1OS0yIgorCWVjaG8gImlzbzg4NTk1IElTTy04ODU5LTUiCisJZWNobyAiaXNvODg1OTYgSVNPLTg4NTktNiIKKwllY2hvICJpc284ODU5NyBJU08tODg1OS03IgorCWVjaG8gImlzbzg4NTk4IElTTy04ODU5LTgiCisJZWNobyAiaXNvODg1OTkgSVNPLTg4NTktOSIKKwllY2hvICJpc284ODU5MTUgSVNPLTg4NTktMTUiCisJZWNobyAicm9tYW44IEhQLVJPTUFOOCIKKwllY2hvICJhcmFiaWM4IEhQLUFSQUJJQzgiCisJZWNobyAiZ3JlZWs4IEhQLUdSRUVLOCIKKwllY2hvICJoZWJyZXc4IEhQLUhFQlJFVzgiCisJZWNobyAidHVya2lzaDggSFAtVFVSS0lTSDgiCisJZWNobyAia2FuYTggSFAtS0FOQTgiCisJZWNobyAidGlzNjIwIFRJUy02MjAiCisJZWNobyAiYmlnNSBCSUc1IgorCWVjaG8gImV1Y0pQIEVVQy1KUCIKKwllY2hvICJldWNLUiBFVUMtS1IiCisJZWNobyAiZXVjVFcgRVVDLVRXIgorCWVjaG8gImhwMTVDTiBHQjIzMTIiCisJI2VjaG8gImNjZGMgPyIgIyB3aGF0IGlzIHRoaXM/CisJZWNobyAiU0pJUyBTSElGVF9KSVMiCisJZWNobyAidXRmOCBVVEYtOCIKKwk7OworICAgIGlyaXgqKQorCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgorCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgorCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgorCWVjaG8gImV1Y0NOIEdCMjMxMiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiZXVjS1IgRVVDLUtSIgorCWVjaG8gImV1Y1RXIEVVQy1UVyIKKwk7OworICAgIG9zZiopCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisJZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCisJZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCisJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwllY2hvICJjcDg1MCBDUDg1MCIKKwllY2hvICJiaWc1IEJJRzUiCisJZWNobyAiZGVjaGFueXUgREVDLUhBTllVIgorCWVjaG8gImRlY2hhbnppIEdCMjMxMiIKKwllY2hvICJkZWNrYW5qaSBERUMtS0FOSkkiCisJZWNobyAiZGVja29yZWFuIEVVQy1LUiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiZXVjS1IgRVVDLUtSIgorCWVjaG8gImV1Y1RXIEVVQy1UVyIKKwllY2hvICJHQksgR0JLIgorCWVjaG8gIktTQzU2MDEgQ1A5NDkiCisJZWNobyAic2RlY2thbmppIEVVQy1KUCIKKwllY2hvICJTSklTIFNISUZUX0pJUyIKKwllY2hvICJUQUNUSVMgVElTLTYyMCIKKwllY2hvICJVVEYtOCBVVEYtOCIKKwk7OworICAgIHNvbGFyaXMqKQorCWVjaG8gIjY0NiBBU0NJSSIKKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKwllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKKwllY2hvICJJU084ODU5LTMgSVNPLTg4NTktMyIKKwllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKKwllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKKwllY2hvICJJU084ODU5LTYgSVNPLTg4NTktNiIKKwllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKKwllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKwllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgorCWVjaG8gImtvaTgtciBLT0k4LVIiCisJZWNobyAiYW5zaS0xMjUxIENQMTI1MSIKKwllY2hvICJCSUc1IEJJRzUiCisJZWNobyAiQmlnNS1IS1NDUyBCSUc1LUhLU0NTIgorCWVjaG8gImdiMjMxMiBHQjIzMTIiCisJZWNobyAiR0JLIEdCSyIKKwllY2hvICJHQjE4MDMwIEdCMTgwMzAiCisJZWNobyAiY25zMTE2NDMgRVVDLVRXIgorCWVjaG8gIjU2MDEgRVVDLUtSIgorCWVjaG8gImtvX0tSLmpvaGFwOTIgSk9IQUIiCisJZWNobyAiZXVjSlAgRVVDLUpQIgorCWVjaG8gIlBDSyBTSElGVF9KSVMiCisJZWNobyAiVElTNjIwLjI1MzMgVElTLTYyMCIKKwkjZWNobyAic3VuX2V1X2dyZWVrID8iICMgd2hhdCBpcyB0aGlzPworCWVjaG8gIlVURi04IFVURi04IgorCTs7CisgICAgZnJlZWJzZCogfCBvczIqKQorCSMgRnJlZUJTRCA0LjIgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwkjIExpa2V3aXNlIGZvciBPUy8yLiBPUy8yIGhhcyBYRnJlZTg2IGp1c3QgbGlrZSBGcmVlQlNELiBKdXN0CisJIyByZXVzZSBGcmVlQlNEJ3MgbG9jYWxlIGRhdGEgZm9yIE9TLzIuCisJZWNobyAiQyBBU0NJSSIKKwllY2hvICJVUy1BU0NJSSBBU0NJSSIKKwlmb3IgbCBpbiBsYV9MTiBsdF9MTjsgZG8KKwkgIGVjaG8gIiRsLkFTQ0lJIEFTQ0lJIgorCWRvbmUKKwlmb3IgbCBpbiBkYV9ESyBkZV9BVCBkZV9DSCBkZV9ERSBlbl9BVSBlbl9DQSBlbl9HQiBlbl9VUyBlc19FUyBcCisJICAgICAgICAgZmlfRkkgZnJfQkUgZnJfQ0EgZnJfQ0ggZnJfRlIgaXNfSVMgaXRfQ0ggaXRfSVQgbGFfTE4gXAorCSAgICAgICAgIGx0X0xOIG5sX0JFIG5sX05MIG5vX05PIHB0X1BUIHN2X1NFOyBkbworCSAgZWNobyAiJGwuSVNPXzg4NTktMSBJU08tODg1OS0xIgorCSAgZWNobyAiJGwuRElTXzg4NTktMTUgSVNPLTg4NTktMTUiCisJZG9uZQorCWZvciBsIGluIGNzX0NaIGhyX0hSIGh1X0hVIGxhX0xOIGx0X0xOIHBsX1BMIHNsX1NJOyBkbworCSAgZWNobyAiJGwuSVNPXzg4NTktMiBJU08tODg1OS0yIgorCWRvbmUKKwlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KKwkgIGVjaG8gIiRsLklTT184ODU5LTQgSVNPLTg4NTktNCIKKwlkb25lCisJZm9yIGwgaW4gcnVfUlUgcnVfU1U7IGRvCisJICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgorCSAgZWNobyAiJGwuSVNPXzg4NTktNSBJU08tODg1OS01IgorCSAgZWNobyAiJGwuQ1A4NjYgQ1A4NjYiCisJZG9uZQorCWVjaG8gInVrX1VBLktPSTgtVSBLT0k4LVUiCisJZWNobyAiemhfVFcuQklHNSBCSUc1IgorCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKKwllY2hvICJ6aF9DTi5FVUMgR0IyMzEyIgorCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCisJZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCisJZWNobyAiamFfSlAuU2hpZnRfSklTIFNISUZUX0pJUyIKKwllY2hvICJrb19LUi5FVUMgRVVDLUtSIgorCTs7CisgICAgbmV0YnNkKikKKwllY2hvICI2NDYgQVNDSUkiCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS00IElTTy04ODU5LTQiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwllY2hvICJldWNDTiBHQjIzMTIiCisJZWNobyAiZXVjSlAgRVVDLUpQIgorCWVjaG8gImV1Y0tSIEVVQy1LUiIKKwllY2hvICJldWNUVyBFVUMtVFciCisJZWNobyAiQklHNSBCSUc1IgorCWVjaG8gIlNKSVMgU0hJRlRfSklTIgorCTs7CisgICAgZGFyd2luKikKKwkjIERhcndpbiA2LjggZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwllY2hvICJDIEFTQ0lJIgorCWZvciBsIGluIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGxhX0xOOyBkbworCSAgZWNobyAiJGwuVVMtQVNDSUkgQVNDSUkiCisJZG9uZQorCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKKwkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBubF9CRSBcCisJICAgICAgICAgbmxfTkwgbm9fTk8gcHRfUFQgc3ZfU0U7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS0xIgorCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgorCWRvbmUKKwlmb3IgbCBpbiBsYV9MTjsgZG8KKwkgIGVjaG8gIiRsLklTTzg4NTktMSBJU08tODg1OS0xIgorCSAgZWNobyAiJGwuSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwlkb25lCisJZm9yIGwgaW4gY3NfQ1ogaHJfSFIgaHVfSFUgbGFfTE4gcGxfUEwgc2xfU0k7IGRvCisJICBlY2hvICIkbC5JU084ODU5LTIgSVNPLTg4NTktMiIKKwlkb25lCisJZm9yIGwgaW4gbGFfTE4gbHRfTFQ7IGRvCisJICBlY2hvICIkbC5JU084ODU5LTQgSVNPLTg4NTktNCIKKwlkb25lCisJZm9yIGwgaW4gcnVfUlU7IGRvCisJICBlY2hvICIkbC5LT0k4LVIgS09JOC1SIgorCSAgZWNobyAiJGwuSVNPODg1OS01IElTTy04ODU5LTUiCisJICBlY2hvICIkbC5DUDg2NiBDUDg2NiIKKwlkb25lCisJZm9yIGwgaW4gYmdfQkc7IGRvCisJICBlY2hvICIkbC5DUDEyNTEgQ1AxMjUxIgorCWRvbmUKKwllY2hvICJ1a19VQS5LT0k4LVUgS09JOC1VIgorCWVjaG8gInpoX1RXLkJJRzUgQklHNSIKKwllY2hvICJ6aF9UVy5CaWc1IEJJRzUiCisJZWNobyAiemhfQ04uRVVDIEdCMjMxMiIKKwllY2hvICJqYV9KUC5FVUMgRVVDLUpQIgorCWVjaG8gImphX0pQLlNKSVMgU0hJRlRfSklTIgorCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCisJOzsKKyAgICBiZW9zKikKKwkjIEJlT1MgaGFzIGEgc2luZ2xlIGxvY2FsZSwgYW5kIGl0IGhhcyBVVEYtOCBlbmNvZGluZy4KKwllY2hvICIqIFVURi04IgorCTs7CisgICAgbXNkb3NkamdwcCopCisJIyBESkdQUCAyLjAzIGRvZXNuJ3QgaGF2ZSBubF9sYW5naW5mbyhDT0RFU0VUKTsgdGhlcmVmb3JlCisJIyBsb2NhbGNoYXJzZXQuYyBmYWxscyBiYWNrIHRvIHVzaW5nIHRoZSBmdWxsIGxvY2FsZSBuYW1lCisJIyBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisJZWNobyAiIyIKKwllY2hvICIjIFRoZSBlbmNvZGluZ3MgZ2l2ZW4gaGVyZSBtYXkgbm90IGFsbCBiZSBjb3JyZWN0LiIKKwllY2hvICIjIElmIHlvdSBmaW5kIHRoYXQgdGhlIGVuY29kaW5nIGdpdmVuIGZvciB5b3VyIGxhbmd1YWdlIGFuZCIKKwllY2hvICIjIGNvdW50cnkgaXMgbm90IHRoZSBvbmUgeW91ciBET1MgbWFjaGluZSBhY3R1YWxseSB1c2VzLCBqdXN0IgorCWVjaG8gIiMgY29ycmVjdCBpdCBpbiB0aGlzIGZpbGUsIGFuZCBzZW5kIGEgbWFpbCB0byIKKwllY2hvICIjIEp1YW4gTWFudWVsIEd1ZXJyZXJvIDxzdDAwMTkwNkBocnoxLmhyei50dS1kYXJtc3RhZHQuZGU+IgorCWVjaG8gIiMgYW5kIEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPi4iCisJZWNobyAiIyIKKwllY2hvICJDIEFTQ0lJIgorCSMgSVNPLTg4NTktMSBsYW5ndWFnZXMKKwllY2hvICJjYSBDUDg1MCIKKwllY2hvICJjYV9FUyBDUDg1MCIKKwllY2hvICJkYSBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJkYV9ESyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJkZSBDUDg1MCIKKwllY2hvICJkZV9BVCBDUDg1MCIKKwllY2hvICJkZV9DSCBDUDg1MCIKKwllY2hvICJkZV9ERSBDUDg1MCIKKwllY2hvICJlbiBDUDg1MCIKKwllY2hvICJlbl9BVSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJlbl9DQSBDUDg1MCIKKwllY2hvICJlbl9HQiBDUDg1MCIKKwllY2hvICJlbl9OWiBDUDQzNyIKKwllY2hvICJlbl9VUyBDUDQzNyIKKwllY2hvICJlbl9aQSBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJlcyBDUDg1MCIKKwllY2hvICJlc19BUiBDUDg1MCIKKwllY2hvICJlc19CTyBDUDg1MCIKKwllY2hvICJlc19DTCBDUDg1MCIKKwllY2hvICJlc19DTyBDUDg1MCIKKwllY2hvICJlc19DUiBDUDg1MCIKKwllY2hvICJlc19DVSBDUDg1MCIKKwllY2hvICJlc19ETyBDUDg1MCIKKwllY2hvICJlc19FQyBDUDg1MCIKKwllY2hvICJlc19FUyBDUDg1MCIKKwllY2hvICJlc19HVCBDUDg1MCIKKwllY2hvICJlc19ITiBDUDg1MCIKKwllY2hvICJlc19NWCBDUDg1MCIKKwllY2hvICJlc19OSSBDUDg1MCIKKwllY2hvICJlc19QQSBDUDg1MCIKKwllY2hvICJlc19QWSBDUDg1MCIKKwllY2hvICJlc19QRSBDUDg1MCIKKwllY2hvICJlc19TViBDUDg1MCIKKwllY2hvICJlc19VWSBDUDg1MCIKKwllY2hvICJlc19WRSBDUDg1MCIKKwllY2hvICJldCBDUDg1MCIKKwllY2hvICJldF9FRSBDUDg1MCIKKwllY2hvICJldSBDUDg1MCIKKwllY2hvICJldV9FUyBDUDg1MCIKKwllY2hvICJmaSBDUDg1MCIKKwllY2hvICJmaV9GSSBDUDg1MCIKKwllY2hvICJmciBDUDg1MCIKKwllY2hvICJmcl9CRSBDUDg1MCIKKwllY2hvICJmcl9DQSBDUDg1MCIKKwllY2hvICJmcl9DSCBDUDg1MCIKKwllY2hvICJmcl9GUiBDUDg1MCIKKwllY2hvICJnYSBDUDg1MCIKKwllY2hvICJnYV9JRSBDUDg1MCIKKwllY2hvICJnZCBDUDg1MCIKKwllY2hvICJnZF9HQiBDUDg1MCIKKwllY2hvICJnbCBDUDg1MCIKKwllY2hvICJnbF9FUyBDUDg1MCIKKwllY2hvICJpZCBDUDg1MCIgICAgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJpZF9JRCBDUDg1MCIgIyBub3QgQ1A0MzcgPz8KKwllY2hvICJpcyBDUDg2MSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJpc19JUyBDUDg2MSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJpdCBDUDg1MCIKKwllY2hvICJpdF9DSCBDUDg1MCIKKwllY2hvICJpdF9JVCBDUDg1MCIKKwllY2hvICJsdCBDUDc3NSIKKwllY2hvICJsdF9MVCBDUDc3NSIKKwllY2hvICJsdiBDUDc3NSIKKwllY2hvICJsdl9MViBDUDc3NSIKKwllY2hvICJuYiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJuYl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJubCBDUDg1MCIKKwllY2hvICJubF9CRSBDUDg1MCIKKwllY2hvICJubF9OTCBDUDg1MCIKKwllY2hvICJubiBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJubl9OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJubyBDUDg2NSIgICAgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJub19OTyBDUDg2NSIgIyBub3QgQ1A4NTAgPz8KKwllY2hvICJwdCBDUDg1MCIKKwllY2hvICJwdF9CUiBDUDg1MCIKKwllY2hvICJwdF9QVCBDUDg1MCIKKwllY2hvICJzdiBDUDg1MCIKKwllY2hvICJzdl9TRSBDUDg1MCIKKwkjIElTTy04ODU5LTIgbGFuZ3VhZ2VzCisJZWNobyAiY3MgQ1A4NTIiCisJZWNobyAiY3NfQ1ogQ1A4NTIiCisJZWNobyAiaHIgQ1A4NTIiCisJZWNobyAiaHJfSFIgQ1A4NTIiCisJZWNobyAiaHUgQ1A4NTIiCisJZWNobyAiaHVfSFUgQ1A4NTIiCisJZWNobyAicGwgQ1A4NTIiCisJZWNobyAicGxfUEwgQ1A4NTIiCisJZWNobyAicm8gQ1A4NTIiCisJZWNobyAicm9fUk8gQ1A4NTIiCisJZWNobyAic2sgQ1A4NTIiCisJZWNobyAic2tfU0sgQ1A4NTIiCisJZWNobyAic2wgQ1A4NTIiCisJZWNobyAic2xfU0kgQ1A4NTIiCisJZWNobyAic3EgQ1A4NTIiCisJZWNobyAic3FfQUwgQ1A4NTIiCisJZWNobyAic3IgQ1A4NTIiICAgICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KKwllY2hvICJzcl9DUyBDUDg1MiIgIyBDUDg1MiBvciBDUDg2NiBvciBDUDg1NSA/PworCWVjaG8gInNyX1lVIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/CisJIyBJU08tODg1OS0zIGxhbmd1YWdlcworCWVjaG8gIm10IENQODUwIgorCWVjaG8gIm10X01UIENQODUwIgorCSMgSVNPLTg4NTktNSBsYW5ndWFnZXMKKwllY2hvICJiZSBDUDg2NiIKKwllY2hvICJiZV9CRSBDUDg2NiIKKwllY2hvICJiZyBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJiZ19CRyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJtayBDUDg2NiIgICAgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJta19NSyBDUDg2NiIgIyBub3QgQ1A4NTUgPz8KKwllY2hvICJydSBDUDg2NiIKKwllY2hvICJydV9SVSBDUDg2NiIKKwllY2hvICJ1ayBDUDExMjUiCisJZWNobyAidWtfVUEgQ1AxMTI1IgorCSMgSVNPLTg4NTktNiBsYW5ndWFnZXMKKwllY2hvICJhciBDUDg2NCIKKwllY2hvICJhcl9BRSBDUDg2NCIKKwllY2hvICJhcl9EWiBDUDg2NCIKKwllY2hvICJhcl9FRyBDUDg2NCIKKwllY2hvICJhcl9JUSBDUDg2NCIKKwllY2hvICJhcl9JUiBDUDg2NCIKKwllY2hvICJhcl9KTyBDUDg2NCIKKwllY2hvICJhcl9LVyBDUDg2NCIKKwllY2hvICJhcl9NQSBDUDg2NCIKKwllY2hvICJhcl9PTSBDUDg2NCIKKwllY2hvICJhcl9RQSBDUDg2NCIKKwllY2hvICJhcl9TQSBDUDg2NCIKKwllY2hvICJhcl9TWSBDUDg2NCIKKwkjIElTTy04ODU5LTcgbGFuZ3VhZ2VzCisJZWNobyAiZWwgQ1A4NjkiCisJZWNobyAiZWxfR1IgQ1A4NjkiCisJIyBJU08tODg1OS04IGxhbmd1YWdlcworCWVjaG8gImhlIENQODYyIgorCWVjaG8gImhlX0lMIENQODYyIgorCSMgSVNPLTg4NTktOSBsYW5ndWFnZXMKKwllY2hvICJ0ciBDUDg1NyIKKwllY2hvICJ0cl9UUiBDUDg1NyIKKwkjIEphcGFuZXNlCisJZWNobyAiamEgQ1A5MzIiCisJZWNobyAiamFfSlAgQ1A5MzIiCisJIyBDaGluZXNlCisJZWNobyAiemhfQ04gR0JLIgorCWVjaG8gInpoX1RXIENQOTUwIiAjIG5vdCBDUDkzOCA/PworCSMgS29yZWFuCisJZWNobyAia3IgQ1A5NDkiICAgICMgbm90IENQOTM0ID8/CisJZWNobyAia3JfS1IgQ1A5NDkiICMgbm90IENQOTM0ID8/CisJIyBUaGFpCisJZWNobyAidGggQ1A4NzQiCisJZWNobyAidGhfVEggQ1A4NzQiCisJIyBPdGhlcgorCWVjaG8gImVvIENQODUwIgorCWVjaG8gImVvX0VPIENQODUwIgorCTs7Citlc2FjCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9kY2dldHRleHQuYwkxOTk4LTA0LTI2IDA5OjIyOjM2LjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2RjZ2V0dGV4dC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzU5NzQ3NDgwIC0wNDAwCkBAIC0xLDU5MyArMSw1NiBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICAgIGFueSBsYXRlciB2ZXJzaW9uLgogCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKICMgaW5jbHVkZSA8Y29uZmlnLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLSNpZm5kZWYgX19zZXRfZXJybm8KLSMgZGVmaW5lIF9fc2V0X2Vycm5vKHZhbCkgZXJybm8gPSAodmFsKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCiAjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKICNpZmRlZiBfTElCQwogIyBpbmNsdWRlIDxsaWJpbnRsLmg+CiAjZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKICNlbmRpZgotI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCiAKIC8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KIAotI2lmZGVmIF9MSUJDCi0vKiBSZW5hbWUgdGhlIG5vbiBBTlNJIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBBTlNJIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGdldGN3ZCBfX2dldGN3ZAotIyBkZWZpbmUgc3RwY3B5IF9fc3RwY3B5Ci0jZWxzZQotIyBpZiAhZGVmaW5lZCBIQVZFX0dFVENXRAotY2hhciAqZ2V0d2QgKCk7Ci0jICBkZWZpbmUgZ2V0Y3dkKGJ1ZiwgbWF4KSBnZXR3ZCAoYnVmKQotIyBlbHNlCi1jaGFyICpnZXRjd2QgKCk7Ci0jIGVuZGlmCi0jIGlmbmRlZiBIQVZFX1NUUENQWQotc3RhdGljIGNoYXIgKnN0cGNweSBQQVJBTVMgKChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBBbW91bnQgdG8gaW5jcmVhc2UgYnVmZmVyIHNpemUgYnkgaW4gZWFjaCB0cnkuICAqLwotI2RlZmluZSBQQVRIX0lOQ1IgMzIKLQotLyogVGhlIGZvbGxvd2luZyBpcyBmcm9tIHBhdGhtYXguaC4gICovCi0vKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKLSAgIFBBVEhfTUFYIGJ1dCBtaWdodCBjYXVzZSByZWRlZmluaXRpb24gd2FybmluZ3Mgd2hlbiBzeXMvcGFyYW0uaCBpcwotICAgbGF0ZXIgaW5jbHVkZWQgKGFzIG9uIE1PUkUvQlNEIDQuMykuICAqLwotI2lmIGRlZmluZWQoX1BPU0lYX1ZFUlNJT04pIHx8IChkZWZpbmVkKEhBVkVfTElNSVRTX0gpICYmICFkZWZpbmVkKF9fR05VQ19fKSkKLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBfUE9TSVhfUEFUSF9NQVgKLSMgZGVmaW5lIF9QT1NJWF9QQVRIX01BWCAyNTUKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoX1BDX1BBVEhfTUFYKQotIyBkZWZpbmUgUEFUSF9NQVggKHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkgPCAxID8gMTAyNCA6IHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkpCi0jZW5kaWYKLQotLyogRG9uJ3QgaW5jbHVkZSBzeXMvcGFyYW0uaCBpZiBpdCBhbHJlYWR5IGhhcyBiZWVuLiAgKi8KLSNpZiBkZWZpbmVkKEhBVkVfU1lTX1BBUkFNX0gpICYmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiAhZGVmaW5lZChNQVhQQVRITEVOKQotIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUEFUSF9NQVgpICYmIGRlZmluZWQoTUFYUEFUSExFTikKLSMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KLSNlbmRpZgotCi0jaWZuZGVmIFBBVEhfTUFYCi0jIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKLSNlbmRpZgotCi0vKiBYUEczIGRlZmluZXMgdGhlIHJlc3VsdCBvZiBgc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCknIGFzOgotICAgYGBEaXJlY3RzIGBzZXRsb2NhbGUoKScgdG8gcXVlcnkgYGNhdGVnb3J5JyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50Ci0gICAgIHNldHRpbmcgb2YgYGxvY2FsJy4nJwotICAgSG93ZXZlciBpdCBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBleGFjdCBmb3JtYXQuICBBbmQgZXZlbiB3b3JzZTogUE9TSVgKLSAgIGRlZmluZXMgdGhpcyBub3QgYXQgYWxsLiAgU28gd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgb25seSBvbiBzZWxlY3RlZAotICAgc3lzdGVtIChlLmcuIHRob3NlIHVzaW5nIEdOVSBDIExpYnJhcnkpLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAotI2VuZGlmCi0KLS8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgZG9tYWluIHVzZWQgZm9yIGdldHRleHQoMykgcHJpb3IgYW55IGNhbGwgdG8KLSAgIHRleHRkb21haW4oMykuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBpcyAibWVzc2FnZXMiLiAgKi8KLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXSA9ICJtZXNzYWdlcyI7Ci0KLS8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KLWNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47Ci0KLS8qIENvbnRhaW5zIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2dzLiAgKi8KLWNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gR05VTE9DQUxFRElSOwotCi0vKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucyBjcmVhdGVkIGJ5IGJpbmR0ZXh0ZG9tYWluKCkKLSAgIGNhbGxzLiAgKi8KLXN0cnVjdCBiaW5kaW5nICpfbmxfZG9tYWluX2JpbmRpbmdzOwotCi0vKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGNoYXIgKmZpbmRfbXNnIFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKm1zZ2lkKSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqY2F0ZWdvcnlfdG9fbmFtZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnkpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpndWVzc19jYXRlZ29yeV92YWx1ZSBQQVJBTVMgKChpbnQgY2F0ZWdvcnksCi0JCQkJCQkgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lKSk7Ci0KLQotLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCi0gICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLwotI2lmZGVmIEhBVkVfQUxMT0NBCi0vKiBOb3RoaW5nIGhhcyB0byBiZSBkb25lLiAgKi8KLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyZXNzKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KSAvKiBub3RoaW5nICovCi0jZWxzZQotc3RydWN0IGJsb2NrX2xpc3QKLXsKLSAgdm9pZCAqYWRkcmVzczsKLSAgc3RydWN0IGJsb2NrX2xpc3QgKm5leHQ7Ci19OwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHIpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHN0cnVjdCBibG9ja19saXN0ICpuZXdwID0gKHN0cnVjdCBibG9ja19saXN0ICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOyAgXAotICAgIC8qIElmIHdlIGNhbm5vdCBnZXQgYSBmcmVlIGJsb2NrIHdlIGNhbm5vdCBhZGQgdGhlIG5ldyBlbGVtZW50IHRvCSAgICAgIFwKLSAgICAgICB0aGUgbGlzdC4gICovCQkJCQkJCSAgICAgIFwKLSAgICBpZiAobmV3cCAhPSBOVUxMKSB7CQkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPmFkZHJlc3MgPSAoYWRkcik7CQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+bmV4dCA9IChsaXN0KTsJCQkJCQkgICAgICBcCi0gICAgICAobGlzdCkgPSBuZXdwOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpCQkJCQkJICAgICAgXAotICBkbyB7CQkJCQkJCQkJICAgICAgXAotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsJCQkJCQkgICAgICBcCi0gICAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqb2xkID0gbGlzdDsJCQkJCSAgICAgIFwKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwkJCQkJCSAgICAgIFwKLSAgICAgIGZyZWUgKG9sZCk7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYShzaXplKSAobWFsbG9jIChzaXplKSkKLSNlbmRpZgkvKiBoYXZlIGFsbG9jYSAqLwotCi0KIC8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKICAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKICAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwogICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KICNpZmRlZiBfTElCQwogIyBkZWZpbmUgRENHRVRURVhUIF9fZGNnZXR0ZXh0CisjIGRlZmluZSBEQ0lHRVRURVhUIF9fZGNpZ2V0dGV4dAogI2Vsc2UKLSMgZGVmaW5lIERDR0VUVEVYVCBkY2dldHRleHRfXworIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0CisjIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAogI2VuZGlmCiAKIC8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQogICAgbG9jYWxlLiAgKi8KIGNoYXIgKgotRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7CitEQ0dFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkLCBpbnQgY2F0ZWdvcnkpCiB7Ci0jaWZuZGVmIEhBVkVfQUxMT0NBCi0gIHN0cnVjdCBibG9ja19saXN0ICpibG9ja19saXN0ID0gTlVMTDsKLSNlbmRpZgotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47Ci0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5dmFsdWU7Ci0gIGNoYXIgKmRpcm5hbWUsICp4ZG9tYWlubmFtZTsKLSAgY2hhciAqc2luZ2xlX2xvY2FsZTsKLSAgY2hhciAqcmV0dmFsOwotICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQotICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KLSAgaWYgKG1zZ2lkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogSWYgRE9NQUlOTkFNRSBpcyBOVUxMLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVmYXVsdCBkb21haW4uICBJZgotICAgICBDQVRFR09SWSBpcyBub3QgTENfTUVTU0FHRVMgdGhpcyBtaWdodCBub3QgbWFrZSBtdWNoIHNlbnNlIGJ1dCB0aGUKLSAgICAgZGVmaW50aW9uIGxlZnQgdGhpcyB1bmRlZmluZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLwotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKLSAgICBkaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLSAgZWxzZSBpZiAoYmluZGluZy0+ZGlybmFtZVswXSA9PSAnLycpCi0gICAgZGlybmFtZSA9IGJpbmRpbmctPmRpcm5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgcmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUgbm93LiAgKi8KLSAgICAgIHNpemVfdCBkaXJuYW1lX2xlbiA9IHN0cmxlbiAoYmluZGluZy0+ZGlybmFtZSkgKyAxOwotICAgICAgc2l6ZV90IHBhdGhfbWF4OwotICAgICAgY2hhciAqcmV0OwotCi0gICAgICBwYXRoX21heCA9ICh1bnNpZ25lZCkgUEFUSF9NQVg7Ci0gICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KLQotICAgICAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7Ci0gICAgICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGRpcm5hbWUpOwotCi0gICAgICBfX3NldF9lcnJubyAoMCk7Ci0gICAgICB3aGlsZSAoKHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpKSA9PSBOVUxMICYmIGVycm5vID09IEVSQU5HRSkKLQl7Ci0JICBwYXRoX21heCArPSBQQVRIX0lOQ1I7Ci0JICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLQkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7Ci0JICBfX3NldF9lcnJubyAoMCk7Ci0JfQotCi0gICAgICBpZiAocmV0ID09IE5VTEwpCi0JewotCSAgLyogV2UgY2Fubm90IGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIERvbid0IHNpZ25hbCBhbgotCSAgICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KLQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICByZXR1cm4gKGNoYXIgKikgbXNnaWQ7Ci0JfQotCi0gICAgICBzdHBjcHkgKHN0cGNweSAoc3RyY2hyIChkaXJuYW1lLCAnXDAnKSwgIi8iKSwgYmluZGluZy0+ZGlybmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG5hbWUgb2YgQ0FURUdPUlkgYW5kIGl0cyB2YWx1ZS4gICovCi0gIGNhdGVnb3J5bmFtZSA9IGNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KTsKLSAgY2F0ZWdvcnl2YWx1ZSA9IGd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKLQotICB4ZG9tYWlubmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeW5hbWUpCi0JCQkJICsgc3RybGVuIChkb21haW5uYW1lKSArIDUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKLQotICBzdHBjcHkgKHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAotCQkgIGRvbWFpbm5hbWUpLAotCSAgIi5tbyIpOwotCi0gIC8qIENyZWF0aW5nIHdvcmtpbmcgYXJlYS4gICovCi0gIHNpbmdsZV9sb2NhbGUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnl2YWx1ZSkgKyAxKTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCBzaW5nbGVfbG9jYWxlKTsKLQotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGdpdmVuIHN0cmluZy4gIFRoaXMgaXMgYSBsb29wIGJlY2F1c2Ugd2UgcGVyaGFwcwotICAgICBnb3QgYW4gb3JkZXJlZCBsaXN0IG9mIGxhbmd1YWdlcyB0byBjb25zaWRlciBmb3IgdGggdHJhbnNsYXRpb24uICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCi0gICAgICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gPT0gJzonKQotCSsrY2F0ZWdvcnl2YWx1ZTsKLSAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCi0JewotCSAgLyogVGhlIHdob2xlIGNvbnRlbnRzIG9mIENBVEVHT1JZVkFMVUUgaGFzIGJlZW4gc2VhcmNoZWQgYnV0Ci0JICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCi0JICAgICBieSBpbXBsaWNpdGx5IGFwcGVuZGluZyBhICJDIiBlbnRyeSwgaS5lLiBubyB0cmFuc2xhdGlvbgotCSAgICAgd2lsbCB0YWtlIHBsYWNlLiAgKi8KLQkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7Ci0JICBzaW5nbGVfbG9jYWxlWzFdID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqY3AgPSBzaW5nbGVfbG9jYWxlOwotCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKLQkgICAgKmNwKysgPSAqY2F0ZWdvcnl2YWx1ZSsrOwotCSAgKmNwID0gJ1wwJzsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCi0JIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCi0JICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCi0JewotCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKLQl9Ci0KLQotICAgICAgLyogRmluZCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBjYXRhbG9nIG1hdGNoaW5nIHRoZQotCSBET01BSU5OQU1FIGFuZCBDQVRFR09SWS4gICovCi0gICAgICBkb21haW4gPSBfbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIHNpbmdsZV9sb2NhbGUsIHhkb21haW5uYW1lKTsKLQotICAgICAgaWYgKGRvbWFpbiAhPSBOVUxMKQotCXsKLQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4sIG1zZ2lkKTsKLQotCSAgaWYgKHJldHZhbCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGNudDsKLQotCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQkJewotCQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBtc2dpZCk7Ci0KLQkJICBpZiAocmV0dmFsICE9IE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgICAgICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgICAgIHJldHVybiByZXR2YWw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCisgIHJldHVybiBEQ0lHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTlVMTCwgMCwgMCwgY2F0ZWdvcnkpOwogfQogCiAjaWZkZWYgX0xJQkMKIC8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLworSU5UREVGKF9fZGNnZXR0ZXh0KQogd2Vha19hbGlhcyAoX19kY2dldHRleHQsIGRjZ2V0dGV4dCk7CiAjZW5kaWYKLQotCi1zdGF0aWMgY2hhciAqCi1maW5kX21zZyAoZG9tYWluX2ZpbGUsIG1zZ2lkKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHNpemVfdCB0b3AsIGFjdCwgYm90dG9tOwotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotCi0gIGlmIChkb21haW5fZmlsZS0+ZGVjaWRlZCA9PSAwKQotICAgIF9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpOwotCi0gIGlmIChkb21haW5fZmlsZS0+ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKLQotICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLwotICBpZiAoZG9tYWluLT5oYXNoX3NpemUgPiAyICYmIGRvbWFpbi0+aGFzaF90YWIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBVc2UgdGhlIGhhc2hpbmcgdGFibGUuICAqLwotICAgICAgbmxzX3VpbnQzMiBsZW4gPSBzdHJsZW4gKG1zZ2lkKTsKLSAgICAgIG5sc191aW50MzIgaGFzaF92YWwgPSBoYXNoX3N0cmluZyAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOwotICAgICAgbmxzX3VpbnQzMiBpbmNyID0gMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKLSAgICAgIG5sc191aW50MzIgbnN0ciA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOwotCi0gICAgICBpZiAobnN0ciA9PSAwKQotCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLwotCXJldHVybiBOVUxMOwotCi0gICAgICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLmxlbmd0aCkgPT0gbGVuCi0JICAmJiBzdHJjbXAgKG1zZ2lkLAotCQkgICAgIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICAgICBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5vZmZzZXQpKSA9PSAwKQotCXJldHVybiAoY2hhciAqKSBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkJICBkb21haW4tPnRyYW5zX3RhYltuc3RyIC0gMV0ub2Zmc2V0KTsKLQotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCi0JICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7Ci0JICBlbHNlCi0JICAgIGlkeCArPSBpbmNyOwotCi0JICBuc3RyID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7Ci0JICBpZiAobnN0ciA9PSAwKQotCSAgICAvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KLQkgICAgICAmJiBzdHJjbXAgKG1zZ2lkLAotCQkJIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgICBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5vZmZzZXQpKQotCSAgICAgICAgID09IDApCi0JICAgIHJldHVybiAoY2hhciAqKSBkb21haW4tPmRhdGEKLQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYltuc3RyIC0gMV0ub2Zmc2V0KTsKLQl9Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgfQotCi0gIC8qIE5vdyB3ZSB0cnkgdGhlIGRlZmF1bHQgbWV0aG9kOiAgYmluYXJ5IHNlYXJjaCBpbiB0aGUgc29ydGVkCi0gICAgIGFycmF5IG9mIG1lc3NhZ2VzLiAgKi8KLSAgYm90dG9tID0gMDsKLSAgdG9wID0gZG9tYWluLT5uc3RyaW5nczsKLSAgd2hpbGUgKGJvdHRvbSA8IHRvcCkKLSAgICB7Ci0gICAgICBpbnQgY21wX3ZhbDsKLQotICAgICAgYWN0ID0gKGJvdHRvbSArIHRvcCkgLyAyOwotICAgICAgY21wX3ZhbCA9IHN0cmNtcCAobXNnaWQsIGRvbWFpbi0+ZGF0YQotCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgIGRvbWFpbi0+b3JpZ190YWJbYWN0XS5vZmZzZXQpKTsKLSAgICAgIGlmIChjbXBfdmFsIDwgMCkKLQl0b3AgPSBhY3Q7Ci0gICAgICBlbHNlIGlmIChjbXBfdmFsID4gMCkKLQlib3R0b20gPSBhY3QgKyAxOwotICAgICAgZWxzZQotCWJyZWFrOwotICAgIH0KLQotICAvKiBJZiBhbiB0cmFuc2xhdGlvbiBpcyBmb3VuZCByZXR1cm4gdGhpcy4gICovCi0gIHJldHVybiBib3R0b20gPj0gdG9wID8gTlVMTCA6IChjaGFyICopIGRvbWFpbi0+ZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICAgZG9tYWluLT50cmFuc190YWJbYWN0XS5vZmZzZXQpOwotfQotCi0KLS8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbG9jYWxlIENBVEVHT1JZLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KQotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICBzd2l0Y2ggKGNhdGVnb3J5KQotICB7Ci0jaWZkZWYgTENfQ09MTEFURQotICBjYXNlIExDX0NPTExBVEU6Ci0gICAgcmV0dmFsID0gIkxDX0NPTExBVEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQ1RZUEUKLSAgY2FzZSBMQ19DVFlQRToKLSAgICByZXR2YWwgPSAiTENfQ1RZUEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTU9ORVRBUlkKLSAgY2FzZSBMQ19NT05FVEFSWToKLSAgICByZXR2YWwgPSAiTENfTU9ORVRBUlkiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTlVNRVJJQwotICBjYXNlIExDX05VTUVSSUM6Ci0gICAgcmV0dmFsID0gIkxDX05VTUVSSUMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfVElNRQotICBjYXNlIExDX1RJTUU6Ci0gICAgcmV0dmFsID0gIkxDX1RJTUUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTUVTU0FHRVMKLSAgY2FzZSBMQ19NRVNTQUdFUzoKLSAgICByZXR2YWwgPSAiTENfTUVTU0FHRVMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfUkVTUE9OU0UKLSAgY2FzZSBMQ19SRVNQT05TRToKLSAgICByZXR2YWwgPSAiTENfUkVTUE9OU0UiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQUxMCi0gIGNhc2UgTENfQUxMOgotICAgIC8qIFRoaXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UgYnV0IGlzIHBlcmhhcHMgYmV0dGVyIHRoYW4gYW55IG90aGVyCi0gICAgICAgdmFsdWUuICAqLwotICAgIHJldHZhbCA9ICJMQ19BTEwiOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgLyogSWYgeW91IGhhdmUgYSBiZXR0ZXIgaWRlYSBmb3IgYSBkZWZhdWx0IHZhbHVlIGxldCBtZSBrbm93LiAgKi8KLSAgICByZXR2YWwgPSAiTENfWFhYIjsKLSAgfQotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qIEd1ZXNzIHZhbHVlIG9mIGN1cnJlbnQgbG9jYWxlIGZyb20gdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSkKLSAgICAgaW50IGNhdGVnb3J5OwotICAgICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAotICAgICB2YXJpYWJsZS4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFOR1VBR0UiKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogYExBTkdVQUdFJyBpcyBub3Qgc2V0LiAgU28gd2UgaGF2ZSB0byBwcm9jZWVkIHdpdGggdGhlIFBPU0lYCi0gICAgIG1ldGhvZHMgb2YgbG9va2luZyB0byBgTENfQUxMJywgYExDX3h4eCcsIGFuZCBgTEFORycuICBPbiBzb21lCi0gICAgIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgYHNldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKLSAgcmV0dXJuIHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpOwotI2Vsc2UKLSAgLyogU2V0dGluZyBvZiBMQ19BTEwgb3ZlcndyaXRlcyBhbGwgb3RoZXIuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjYXRlZ29yeS4gICovCi0gIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogTGFzdCBwb3NzaWJpbGl0eSBpcyB0aGUgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzIGltcGxlbWVudGF0aW9uCi0gICAgIGRlZmluZWQuICAqLwotICByZXR1cm4gIkMiOwotI2VuZGlmCi19Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2RjaWdldHRleHQuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2RjaWdldHRleHQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjM2OTc0NTk2MCAtMDQwMApAQCAtMCwwICsxLDEyMTkgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBkY2lnZXR0ZXh0IGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZuZGVmIGVycm5vCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisjaWZuZGVmIF9fc2V0X2Vycm5vCisjIGRlZmluZSBfX3NldF9lcnJubyh2YWwpIGVycm5vID0gKHZhbCkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZmRlZiBfTElCQworICAvKiBHdWVzcyB3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgc2lnbmFsIFNJR0ZQRS4KKyAgICAgU2V0IHRvIDEgb25seSBpZiB5b3Uga25vdyBmb3Igc3VyZS4gIEluIGNhc2Ugb2YgZG91YnQsIHNldCB0byAwLiAgKi8KKyMgaWYgZGVmaW5lZCBfX2FscGhhX18gfHwgZGVmaW5lZCBfX2FybV9fIHx8IGRlZmluZWQgX19pMzg2X18gXAorICAgICB8fCBkZWZpbmVkIF9fbTY4a19fIHx8IGRlZmluZWQgX19zMzkwX18KKyMgIGRlZmluZSBJTlRESVYwX1JBSVNFU19TSUdGUEUgMQorIyBlbHNlCisjICBkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFIDAKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgorCisvKiBUaHJlYWQgc2FmZXR5bmVzcy4gICovCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyNlbHNlCisvKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCisjIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsIE5BTUUpCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLCBOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja19yZGxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCisjZW5kaWYKKworLyogQWxpZ25tZW50IG9mIHR5cGVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgZGVmaW5lIGFsaWdub2YoVFlQRSkgX19hbGlnbm9mX18gKFRZUEUpCisjZWxzZQorIyBkZWZpbmUgYWxpZ25vZihUWVBFKSBcCisgICAgKChpbnQpICYoKHN0cnVjdCB7IGNoYXIgZHVtbXkxOyBUWVBFIGR1bW15MjsgfSAqKSAwKS0+ZHVtbXkyKQorI2VuZGlmCisKKy8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisgICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KKyNpZiAhZGVmaW5lZCBfTElCQworIyBkZWZpbmUgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluCisjIGRlZmluZSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4KKyMgZGVmaW5lIF9ubF9kZWZhdWx0X2Rpcm5hbWUgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWUKKyMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKKyNlbmRpZgorCisvKiBTb21lIGNvbXBpbGVycywgbGlrZSBTdW5PUzQgY2MsIGRvbid0IGhhdmUgb2Zmc2V0b2YgaW4gPHN0ZGRlZi5oPi4gICovCisjaWZuZGVmIG9mZnNldG9mCisjIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZmRlZiBfTElCQworLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCisgICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0CisgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCisjIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKKyMgaWZuZGVmIHN0cGNweQorIyAgZGVmaW5lIHN0cGNweSBfX3N0cGNweQorIyBlbmRpZgorIyBkZWZpbmUgdGZpbmQgX190ZmluZAorI2Vsc2UKKyMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKK2NoYXIgKmdldHdkICgpOworIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKKyMgZWxzZQorIyAgaWYgVk1TCisjICAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgKGdldGN3ZCkgKGJ1ZiwgbWF4LCAwKQorIyAgZWxzZQorY2hhciAqZ2V0Y3dkICgpOworIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOworIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9NRU1QQ1BZCitzdGF0aWMgdm9pZCAqbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7CisjIGVuZGlmCisjZW5kaWYKKworLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KKyNkZWZpbmUgUEFUSF9JTkNSIDMyCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLworLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCisgICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKKyAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KKyNpZiBkZWZpbmVkIF9QT1NJWF9WRVJTSU9OIHx8IChkZWZpbmVkIEhBVkVfTElNSVRTX0ggJiYgIWRlZmluZWQgX19HTlVDX18pCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCisjIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1CisjZW5kaWYKKworI2lmICFkZWZpbmVkIFBBVEhfTUFYICYmIGRlZmluZWQgX1BDX1BBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKKyNlbmRpZgorCisvKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLworI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCAmJiAhZGVmaW5lZCBQQVRIX01BWCAmJiAhZGVmaW5lZCBNQVhQQVRITEVOCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBQQVRIX01BWCAmJiBkZWZpbmVkIE1BWFBBVEhMRU4KKyMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KKyNlbmRpZgorCisjaWZuZGVmIFBBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKKyNlbmRpZgorCisvKiBQYXRobmFtZSBzdXBwb3J0LgorICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCisgICBJU19QQVRIX1dJVEhfRElSKFApICB0ZXN0cyB3aGV0aGVyIFAgY29udGFpbnMgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KKyAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorICAgICAmJiAoUClbMV0gPT0gJzonKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKKyMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgXAorICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCisjZWxzZQorICAvKiBVbml4ICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCisjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgZm9yIHRoZSBzZWFyY2ggdHJlZSB3aGVyZSBrbm93biB0cmFuc2xhdGlvbnMKKyAgIGFyZSBzdG9yZWQuICAqLworc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QKK3sKKyAgLyogRG9tYWluIGluIHdoaWNoIHRvIHNlYXJjaC4gICovCisgIGNoYXIgKmRvbWFpbm5hbWU7CisKKyAgLyogVGhlIGNhdGVnb3J5LiAgKi8KKyAgaW50IGNhdGVnb3J5OworCisgIC8qIFN0YXRlIG9mIHRoZSBjYXRhbG9nIGNvdW50ZXIgYXQgdGhlIHBvaW50IHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KKyAgaW50IGNvdW50ZXI7CisKKyAgLyogQ2F0YWxvZyB3aGVyZSB0aGUgc3RyaW5nIHdhcyBmb3VuZC4gICovCisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKKworICAvKiBBbmQgZmluYWxseSB0aGUgdHJhbnNsYXRpb24uICAqLworICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbjsKKyAgc2l6ZV90IHRyYW5zbGF0aW9uX2xlbmd0aDsKKworICAvKiBQb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gcXVlc3Rpb24uICAqLworICBjaGFyIG1zZ2lkW1pFUk9dOworfTsKKworLyogUm9vdCBvZiB0aGUgc2VhcmNoIHRyZWUgd2l0aCBrbm93biB0cmFuc2xhdGlvbnMuICBXZSBjYW4gdXNlIHRoaXMKKyAgIG9ubHkgaWYgdGhlIHN5c3RlbSBwcm92aWRlcyB0aGUgYHRzZWFyY2gnIGZ1bmN0aW9uIGZhbWlseS4gICovCisjaWYgZGVmaW5lZCBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzZWFyY2guaD4KKworc3RhdGljIHZvaWQgKnJvb3Q7CisKKyMgaWZkZWYgX0xJQkMKKyMgIGRlZmluZSB0c2VhcmNoIF9fdHNlYXJjaAorIyBlbmRpZgorCisvKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBrbm93biB0cmFuc2xhdGlvbnMuICAqLworc3RhdGljIGludAordHJhbnNjbXAgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKyAgY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnMxOworICBjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqczI7CisgIGludCByZXN1bHQ7CisKKyAgczEgPSAoY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikgcDE7CisgIHMyID0gKGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIHAyOworCisgIHJlc3VsdCA9IHN0cmNtcCAoczEtPm1zZ2lkLCBzMi0+bXNnaWQpOworICBpZiAocmVzdWx0ID09IDApCisgICAgeworICAgICAgcmVzdWx0ID0gc3RyY21wIChzMS0+ZG9tYWlubmFtZSwgczItPmRvbWFpbm5hbWUpOworICAgICAgaWYgKHJlc3VsdCA9PSAwKQorCS8qIFdlIGNvbXBhcmUgdGhlIGNhdGVnb3J5IGxhc3QgKHRob3VnaCB0aGlzIGlzIHRoZSBjaGVhcGVzdAorCSAgIG9wZXJhdGlvbikgc2luY2UgaXQgaXMgaG9wZWZ1bGx5IGFsd2F5cyB0aGUgc2FtZSAobmFtZWx5CisJICAgTENfTUVTU0FHRVMpLiAgKi8KKwlyZXN1bHQgPSBzMS0+Y2F0ZWdvcnkgLSBzMi0+Y2F0ZWdvcnk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBJTlRWQVJERUYKKyMgZGVmaW5lIElOVFZBUkRFRihuYW1lKQorI2VuZGlmCisjaWZuZGVmIElOVFVTRQorIyBkZWZpbmUgSU5UVVNFKG5hbWUpIG5hbWUKKyNlbmRpZgorCisvKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCisgICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCitjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gYXR0cmlidXRlX2hpZGRlbiA9ICJtZXNzYWdlcyI7CisKKy8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KK2NvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW4KKyAgICAgPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKKworLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLworI2lmIGRlZmluZWQgX19FTVhfXworZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOworI2Vsc2UKK2NvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gTE9DQUxFRElSOworSU5UVkFSREVGIChfbmxfZGVmYXVsdF9kaXJuYW1lKQorI2VuZGlmCisKKy8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zIGNyZWF0ZWQgYnkgYmluZHRleHRkb21haW4oKQorICAgY2FsbHMuICAqLworc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgY2hhciAqcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaW50IG4sCisJCQkgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksCisJCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCisjIGRlZmluZSBjYXRlZ29yeV90b19uYW1lKGNhdGVnb3J5KQlfbmxfY2F0ZWdvcnlfbmFtZXNbY2F0ZWdvcnldCisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgKmNhdGVnb3J5X3RvX25hbWUgKGludCBjYXRlZ29yeSkgaW50ZXJuYWxfZnVuY3Rpb247CisjZW5kaWYKKworCisvKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKKyAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCisjaWZkZWYgSEFWRV9BTExPQ0EKKy8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLworIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLworIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KKyNlbHNlCitzdHJ1Y3QgYmxvY2tfbGlzdAoreworICB2b2lkICphZGRyZXNzOworICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKK307CisjIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCisgICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAorICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAorICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAorICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCisgICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKKyAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKKyAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAorICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAorICAgICAgZnJlZSAob2xkLT5hZGRyZXNzKTsJCQkJCQkgICAgICBcCisgICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgdW5kZWYgYWxsb2NhCisjIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCisjIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQorI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCisKKworI2lmZGVmIF9MSUJDCisvKiBMaXN0IG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIHRyYW5zbGF0aW9ucy4gICovCit0eXBlZGVmIHN0cnVjdCB0cmFuc21lbV9saXN0Cit7CisgIHN0cnVjdCB0cmFuc21lbV9saXN0ICpuZXh0OworICBjaGFyIGRhdGFbWkVST107Cit9IHRyYW5zbWVtX2Jsb2NrX3Q7CitzdGF0aWMgc3RydWN0IHRyYW5zbWVtX2xpc3QgKnRyYW5zbWVtX2xpc3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRyYW5zbWVtX2Jsb2NrX3Q7CisjZW5kaWYKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKKyNlbmRpZgorCisvKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KKyNpZmRlZiBfTElCQworX19saWJjX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKCwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKyNlbmRpZgorCisvKiBDaGVja2luZyB3aGV0aGVyIHRoZSBiaW5hcmllcyBydW5zIFNVSUQgbXVzdCBiZSBkb25lIGFuZCBnbGliYyBwcm92aWRlcworICAgZWFzaWVyIG1ldGhvZHMgdGhlcmVmb3JlIHdlIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBFTkFCTEVfU0VDVVJFIF9fbGliY19lbmFibGVfc2VjdXJlCisjIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFCisjZWxzZQorIyBpZm5kZWYgSEFWRV9HRVRVSUQKKyMgIGRlZmluZSBnZXR1aWQoKSAwCisjIGVuZGlmCisjIGlmbmRlZiBIQVZFX0dFVEdJRAorIyAgZGVmaW5lIGdldGdpZCgpIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfR0VURVVJRAorIyAgZGVmaW5lIGdldGV1aWQoKSBnZXR1aWQoKQorIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9HRVRFR0lECisjICBkZWZpbmUgZ2V0ZWdpZCgpIGdldGdpZCgpCisjIGVuZGlmCitzdGF0aWMgaW50IGVuYWJsZV9zZWN1cmU7CisjIGRlZmluZSBFTkFCTEVfU0VDVVJFIChlbmFibGVfc2VjdXJlID09IDEpCisjIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFIFwKKyAgaWYgKGVuYWJsZV9zZWN1cmUgPT0gMCkJCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIGlmIChnZXR1aWQgKCkgIT0gZ2V0ZXVpZCAoKSB8fCBnZXRnaWQgKCkgIT0gZ2V0ZWdpZCAoKSkJCSAgICAgIFwKKwllbmFibGVfc2VjdXJlID0gMTsJCQkJCQkgICAgICBcCisgICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisJZW5hYmxlX3NlY3VyZSA9IC0xOwkJCQkJCSAgICAgIFwKKyAgICB9CisjZW5kaWYKKworLyogR2V0IHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24uICAqLworI2luY2x1ZGUgImV2YWwtcGx1cmFsLmgiCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgQ0FURUdPUlkgbG9jYWxlIGFuZCwgaWYgUExVUkFMIGlzIG5vbnplcm8sIHNlYXJjaCBvdmVyIHN0cmluZworICAgZGVwZW5kaW5nIG9uIHRoZSBwbHVyYWwgZm9ybSBkZXRlcm1pbmVkIGJ5IE4uICAqLworY2hhciAqCitEQ0lHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKKwkgICAgaW50IHBsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgbiwgaW50IGNhdGVnb3J5KQoreworI2lmbmRlZiBIQVZFX0FMTE9DQQorICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7CisjZW5kaWYKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOworICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKKyAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOworICBjb25zdCBjaGFyICpjYXRlZ29yeXZhbHVlOworICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7CisgIGNoYXIgKnNpbmdsZV9sb2NhbGU7CisgIGNoYXIgKnJldHZhbDsKKyAgc2l6ZV90IHJldGxlbjsKKyAgaW50IHNhdmVkX2Vycm5vOworI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKyAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnNlYXJjaDsKKyAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKipmb3VuZHAgPSBOVUxMOworICBzaXplX3QgbXNnaWRfbGVuOworI2VuZGlmCisgIHNpemVfdCBkb21haW5uYW1lX2xlbjsKKworICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KKyAgaWYgKG1zZ2lkMSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisjaWZkZWYgX0xJQkMKKyAgaWYgKGNhdGVnb3J5IDwgMCB8fCBjYXRlZ29yeSA+PSBfX0xDX0xBU1QgfHwgY2F0ZWdvcnkgPT0gTENfQUxMKQorICAgIC8qIEJvZ3VzLiAgKi8KKyAgICByZXR1cm4gKHBsdXJhbCA9PSAwCisJICAgID8gKGNoYXIgKikgbXNnaWQxCisJICAgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLworCSAgICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7CisjZW5kaWYKKworICBfX2xpYmNfcndsb2NrX3JkbG9jayAoX25sX3N0YXRlX2xvY2spOworCisgIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKKyAgICAgQ0FURUdPUlkgaXMgbm90IExDX01FU1NBR0VTIHRoaXMgbWlnaHQgbm90IG1ha2UgbXVjaCBzZW5zZSBidXQgdGhlCisgICAgIGRlZmluaXRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisgICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIC8qIE9TLzIgc3BlY2lmaWM6IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaWJpbnRsIHZlcnNpb25zICAqLworI2lmZGVmIExDX01FU1NBR0VTX0NPTVBBVAorICBpZiAoY2F0ZWdvcnkgPT0gTENfTUVTU0FHRVNfQ09NUEFUKQorICAgIGNhdGVnb3J5ID0gTENfTUVTU0FHRVM7CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKyAgbXNnaWRfbGVuID0gc3RybGVuIChtc2dpZDEpICsgMTsKKworICAvKiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gYW1vbmcgdGhvc2Ugd2hpY2ggd2UgZm91bmQgYXQKKyAgICAgc29tZSB0aW1lLiAgKi8KKyAgc2VhcmNoID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopCisJICAgYWxsb2NhIChvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKSArIG1zZ2lkX2xlbik7CisgIG1lbWNweSAoc2VhcmNoLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOworICBzZWFyY2gtPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBkb21haW5uYW1lOworICBzZWFyY2gtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisKKyAgZm91bmRwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqKSB0ZmluZCAoc2VhcmNoLCAmcm9vdCwgdHJhbnNjbXApOworICBmcmVlYSAoc2VhcmNoKTsKKyAgaWYgKGZvdW5kcCAhPSBOVUxMICYmICgqZm91bmRwKS0+Y291bnRlciA9PSBfbmxfbXNnX2NhdF9jbnRyKQorICAgIHsKKyAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KKyAgICAgIGlmIChwbHVyYWwpCisJcmV0dmFsID0gcGx1cmFsX2xvb2t1cCAoKCpmb3VuZHApLT5kb21haW4sIG4sICgqZm91bmRwKS0+dHJhbnNsYXRpb24sCisJCQkJKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGgpOworICAgICAgZWxzZQorCXJldHZhbCA9IChjaGFyICopICgqZm91bmRwKS0+dHJhbnNsYXRpb247CisKKyAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyNlbmRpZgorCisgIC8qIFByZXNlcnZlIHRoZSBgZXJybm8nIHZhbHVlLiAgKi8KKyAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgb3Igbm90LiAgKi8KKyAgREVURVJNSU5FX1NFQ1VSRTsKKworICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLworICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKKyAgICAgIGlmIChjb21wYXJlID09IDApCisJLyogV2UgZm91bmQgaXQhICAqLworCWJyZWFrOworICAgICAgaWYgKGNvbXBhcmUgPCAwKQorCXsKKwkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCisJICBiaW5kaW5nID0gTlVMTDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKKyAgICBkaXJuYW1lID0gKGNoYXIgKikgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworICBlbHNlIGlmIChJU19BQlNPTFVURV9QQVRIIChiaW5kaW5nLT5kaXJuYW1lKSkKKyAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLworICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7CisgICAgICBzaXplX3QgcGF0aF9tYXg7CisgICAgICBjaGFyICpyZXQ7CisKKyAgICAgIHBhdGhfbWF4ID0gKHVuc2lnbmVkIGludCkgUEFUSF9NQVg7CisgICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KKworICAgICAgZm9yICg7OykKKwl7CisJICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKKwkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7CisKKwkgIF9fc2V0X2Vycm5vICgwKTsKKwkgIHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpOworCSAgaWYgKHJldCAhPSBOVUxMIHx8IGVycm5vICE9IEVSQU5HRSkKKwkgICAgYnJlYWs7CisKKwkgIHBhdGhfbWF4ICs9IHBhdGhfbWF4IC8gMjsKKwkgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKKwl9CisKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkKKwkvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCisJICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KKwlnb3RvIHJldHVybl91bnRyYW5zbGF0ZWQ7CisKKyAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKKyAgICB9CisKKyAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KKyAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOworICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOworCisgIGRvbWFpbm5hbWVfbGVuID0gc3RybGVuIChkb21haW5uYW1lKTsKKyAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQorCQkJCSArIGRvbWFpbm5hbWVfbGVuICsgNSk7CisgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgeGRvbWFpbm5hbWUpOworCisgIHN0cGNweSAobWVtcGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAorCQkgIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuKSwKKwkgICIubW8iKTsKKworICAvKiBDcmVhdGluZyB3b3JraW5nIGFyZWEuICAqLworICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7CisgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7CisKKworICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKKyAgICAgZ290IGFuIG9yZGVyZWQgbGlzdCBvZiBsYW5ndWFnZXMgdG8gY29uc2lkZXIgZm9yIHRoZSB0cmFuc2xhdGlvbi4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIE1ha2UgQ0FURUdPUllWQUxVRSBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgKi8KKyAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCisJKytjYXRlZ29yeXZhbHVlOworICAgICAgaWYgKGNhdGVnb3J5dmFsdWVbMF0gPT0gJ1wwJykKKwl7CisJICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKKwkgICAgIG5vIHZhbGlkIGVudHJ5IGhhcyBiZWVuIGZvdW5kLiAgV2Ugc29sdmUgdGhpcyBzaXR1YXRpb24KKwkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCisJICAgICB3aWxsIHRha2UgcGxhY2UuICAqLworCSAgc2luZ2xlX2xvY2FsZVswXSA9ICdDJzsKKwkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7CisJICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gIT0gJzonKQorCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7CisJICAqY3AgPSAnXDAnOworCisJICAvKiBXaGVuIHRoaXMgaXMgYSBTVUlEIGJpbmFyeSB3ZSBtdXN0IG5vdCBhbGxvdyBhY2Nlc3NpbmcgZmlsZXMKKwkgICAgIG91dHNpZGUgdGhlIGRlZGljYXRlZCBkaXJlY3Rvcmllcy4gICovCisJICBpZiAoRU5BQkxFX1NFQ1VSRSAmJiBJU19QQVRIX1dJVEhfRElSIChzaW5nbGVfbG9jYWxlKSkKKwkgICAgLyogSW5nb3JlIHRoaXMgZW50cnkuICAqLworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCisJIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLworICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCisJICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKKwkgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkuICAqLworICAgICAgZG9tYWluID0gX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBzaW5nbGVfbG9jYWxlLCB4ZG9tYWlubmFtZSwgYmluZGluZyk7CisKKyAgICAgIGlmIChkb21haW4gIT0gTlVMTCkKKwl7CisJICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbiwgYmluZGluZywgbXNnaWQxLCAmcmV0bGVuKTsKKworCSAgaWYgKHJldHZhbCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgaW50IGNudDsKKworCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKwkJeworCQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLT5zdWNjZXNzb3JbY250XSwgYmluZGluZywKKwkJCQkJIG1zZ2lkMSwgJnJldGxlbik7CisKKwkJICBpZiAocmV0dmFsICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGRvbWFpbiA9IGRvbWFpbi0+c3VjY2Vzc29yW2NudF07CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKHJldHZhbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogRm91bmQgdGhlIHRyYW5zbGF0aW9uIG9mIE1TR0lEMSBpbiBkb21haW4gRE9NQUlOOgorCQkgc3RhcnRpbmcgYXQgUkVUVkFMLCBSRVRMRU4gYnl0ZXMuICAqLworCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKyNpZiBkZWZpbmVkIEhBVkVfVFNFQVJDSCB8fCBkZWZpbmVkIF9MSUJDCisJICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMKQorCQl7CisJCSAgLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIHNlYXJjaCB0cmVlLiAgKi8KKwkJICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqbmV3cDsKKworCQkgIG5ld3AgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikKKwkJICAgIG1hbGxvYyAob2Zmc2V0b2YgKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90LCBtc2dpZCkKKwkJCSAgICArIG1zZ2lkX2xlbiArIGRvbWFpbm5hbWVfbGVuICsgMSk7CisJCSAgaWYgKG5ld3AgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgbmV3cC0+ZG9tYWlubmFtZSA9CisJCQltZW1wY3B5IChuZXdwLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOworCQkgICAgICBtZW1jcHkgKG5ld3AtPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuICsgMSk7CisJCSAgICAgIG5ld3AtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJCSAgICAgIG5ld3AtPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOworCQkgICAgICBuZXdwLT5kb21haW4gPSBkb21haW47CisJCSAgICAgIG5ld3AtPnRyYW5zbGF0aW9uID0gcmV0dmFsOworCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47CisKKwkJICAgICAgLyogSW5zZXJ0IHRoZSBlbnRyeSBpbiB0aGUgc2VhcmNoIHRyZWUuICAqLworCQkgICAgICBmb3VuZHAgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKiopCisJCQl0c2VhcmNoIChuZXdwLCAmcm9vdCwgdHJhbnNjbXApOworCQkgICAgICBpZiAoZm91bmRwID09IE5VTEwKKwkJCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKmZvdW5kcCAhPSBuZXdwLCAwKSkKKwkJCS8qIFRoZSBpbnNlcnQgZmFpbGVkLiAgKi8KKwkJCWZyZWUgKG5ld3ApOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogV2UgY2FuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkuICAqLworCQkgICgqZm91bmRwKS0+Y291bnRlciA9IF9ubF9tc2dfY2F0X2NudHI7CisJCSAgKCpmb3VuZHApLT5kb21haW4gPSBkb21haW47CisJCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbiA9IHJldHZhbDsKKwkJICAoKmZvdW5kcCktPnRyYW5zbGF0aW9uX2xlbmd0aCA9IHJldGxlbjsKKwkJfQorI2VuZGlmCisJICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKworCSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KKwkgICAgICBpZiAocGx1cmFsKQorCQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwIChkb21haW4sIG4sIHJldHZhbCwgcmV0bGVuKTsKKworCSAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7CisJICAgICAgcmV0dXJuIHJldHZhbDsKKwkgICAgfQorCX0KKyAgICB9CisKKyByZXR1cm5fdW50cmFuc2xhdGVkOgorICAvKiBSZXR1cm4gdGhlIHVudHJhbnNsYXRlZCBNU0dJRC4gICovCisgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKyNpZm5kZWYgX0xJQkMKKyAgaWYgKCFFTkFCTEVfU0VDVVJFKQorICAgIHsKKyAgICAgIGV4dGVybiB2b2lkIF9ubF9sb2dfdW50cmFuc2xhdGVkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwKKwkJCQkJY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkJCQkJY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCisJCQkJCWludCBwbHVyYWwpOworICAgICAgY29uc3QgY2hhciAqbG9nZmlsZW5hbWUgPSBnZXRlbnYgKCJHRVRURVhUX0xPR19VTlRSQU5TTEFURUQiKTsKKworICAgICAgaWYgKGxvZ2ZpbGVuYW1lICE9IE5VTEwgJiYgbG9nZmlsZW5hbWVbMF0gIT0gJ1wwJykKKwlfbmxfbG9nX3VudHJhbnNsYXRlZCAobG9nZmlsZW5hbWUsIGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBwbHVyYWwpOworICAgIH0KKyNlbmRpZgorICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOworICByZXR1cm4gKHBsdXJhbCA9PSAwCisJICA/IChjaGFyICopIG1zZ2lkMQorCSAgLyogVXNlIHRoZSBHZXJtYW5pYyBwbHVyYWwgcnVsZS4gICovCisJICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7Cit9CisKKworY2hhciAqCitpbnRlcm5hbF9mdW5jdGlvbgorX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKwkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywgY29uc3QgY2hhciAqbXNnaWQsCisJICAgICAgc2l6ZV90ICpsZW5ndGhwKQoreworICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOworICBubHNfdWludDMyIG5zdHJpbmdzOworICBzaXplX3QgYWN0OworICBjaGFyICpyZXN1bHQ7CisgIHNpemVfdCByZXN1bHRsZW47CisKKyAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkID09IDApCisgICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZyk7CisKKyAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOworCisgIG5zdHJpbmdzID0gZG9tYWluLT5uc3RyaW5nczsKKworICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLworICBpZiAoZG9tYWluLT5oYXNoX3RhYiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVzZSB0aGUgaGFzaGluZyB0YWJsZS4gICovCisgICAgICBubHNfdWludDMyIGxlbiA9IHN0cmxlbiAobXNnaWQpOworICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7CisgICAgICBubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7CisgICAgICBubHNfdWludDMyIGluY3IgPSAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOworCisgICAgICB3aGlsZSAoMSkKKwl7CisJICBubHNfdWludDMyIG5zdHIgPQorCSAgICBXIChkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKKworCSAgaWYgKG5zdHIgPT0gMCkKKwkgICAgLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCisJICAgIHJldHVybiBOVUxMOworCisJICBuc3RyLS07CisKKwkgIC8qIENvbXBhcmUgbXNnaWQgd2l0aCB0aGUgb3JpZ2luYWwgc3RyaW5nIGF0IGluZGV4IG5zdHIuCisJICAgICBXZSBjb21wYXJlIHRoZSBsZW5ndGhzIHdpdGggPj0sIG5vdCA9PSwgYmVjYXVzZSBwbHVyYWwgZW50cmllcworCSAgICAgYXJlIHJlcHJlc2VudGVkIGJ5IHN0cmluZ3Mgd2l0aCBhbiBlbWJlZGRlZCBOVUwuICAqLworCSAgaWYgKG5zdHIgPCBuc3RyaW5ncworCSAgICAgID8gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ubGVuZ3RoKSA+PSBsZW4KKwkJJiYgKHN0cmNtcCAobXNnaWQsCisJCQkgICAgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJCSAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ub2Zmc2V0KSkKKwkJICAgID09IDApCisJICAgICAgOiBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLmxlbmd0aCA+IGxlbgorCQkmJiAoc3RyY21wIChtc2dpZCwKKwkJCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLnBvaW50ZXIpCisJCSAgICA9PSAwKSkKKwkgICAgeworCSAgICAgIGFjdCA9IG5zdHI7CisJICAgICAgZ290byBmb3VuZDsKKwkgICAgfQorCisJICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKKwkgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKKwkgIGVsc2UKKwkgICAgaWR4ICs9IGluY3I7CisJfQorICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQgYXJyYXkgb2YKKwkgbWVzc2FnZXMuICAqLworICAgICAgc2l6ZV90IHRvcCwgYm90dG9tOworCisgICAgICBib3R0b20gPSAwOworICAgICAgdG9wID0gbnN0cmluZ3M7CisgICAgICB3aGlsZSAoYm90dG9tIDwgdG9wKQorCXsKKwkgIGludCBjbXBfdmFsOworCisJICBhY3QgPSAoYm90dG9tICsgdG9wKSAvIDI7CisJICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgKGRvbWFpbi0+ZGF0YQorCQkJCSAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorCQkJCQkgZG9tYWluLT5vcmlnX3RhYlthY3RdLm9mZnNldCkpKTsKKwkgIGlmIChjbXBfdmFsIDwgMCkKKwkgICAgdG9wID0gYWN0OworCSAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCisJICAgIGJvdHRvbSA9IGFjdCArIDE7CisJICBlbHNlCisJICAgIGdvdG8gZm91bmQ7CisJfQorICAgICAgLyogTm8gdHJhbnNsYXRpb24gd2FzIGZvdW5kLiAgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworIGZvdW5kOgorICAvKiBUaGUgdHJhbnNsYXRpb24gd2FzIGZvdW5kIGF0IGluZGV4IEFDVC4gIElmIHdlIGhhdmUgdG8gY29udmVydCB0aGUKKyAgICAgc3RyaW5nIHRvIHVzZSBhIGRpZmZlcmVudCBjaGFyYWN0ZXIgc2V0LCB0aGlzIGlzIHRoZSB0aW1lLiAgKi8KKyAgaWYgKGFjdCA8IG5zdHJpbmdzKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IChjaGFyICopCisJKGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYlthY3RdLm9mZnNldCkpOworICAgICAgcmVzdWx0bGVuID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ubGVuZ3RoKSArIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzdWx0ID0gKGNoYXIgKikgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5wb2ludGVyOworICAgICAgcmVzdWx0bGVuID0gZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5sZW5ndGg7CisgICAgfQorCisjaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX0lDT05WCisgIGlmIChkb21haW4tPmNvZGVzZXRfY250cgorICAgICAgIT0gKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCA/IGRvbWFpbmJpbmRpbmctPmNvZGVzZXRfY250ciA6IDApKQorICAgIHsKKyAgICAgIC8qIFRoZSBkb21haW4ncyBjb2Rlc2V0IGhhcyBjaGFuZ2VkIHRocm91Z2ggYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKQorCSBzaW5jZSB0aGUgbWVzc2FnZSBjYXRhbG9nIHdhcyBpbml0aWFsaXplZCBvciBsYXN0IGFjY2Vzc2VkLiAgV2UKKwkgaGF2ZSB0byByZWluaXRpYWxpemUgdGhlIGNvbnZlcnRlci4gICovCisgICAgICBfbmxfZnJlZV9kb21haW5fY29udiAoZG9tYWluKTsKKyAgICAgIF9ubF9pbml0X2RvbWFpbl9jb252IChkb21haW5fZmlsZSwgZG9tYWluLCBkb21haW5iaW5kaW5nKTsKKyAgICB9CisKKyAgaWYgKAorIyBpZmRlZiBfTElCQworICAgICAgZG9tYWluLT5jb252ICE9IChfX2djb252X3QpIC0xCisjIGVsc2UKKyMgIGlmIEhBVkVfSUNPTlYKKyAgICAgIGRvbWFpbi0+Y29udiAhPSAoaWNvbnZfdCkgLTEKKyMgIGVuZGlmCisjIGVuZGlmCisgICAgICApCisgICAgeworICAgICAgLyogV2UgYXJlIHN1cHBvc2VkIHRvIGRvIGEgY29udmVyc2lvbi4gIEZpcnN0IGFsbG9jYXRlIGFuCisJIGFwcHJvcHJpYXRlIHRhYmxlIHdpdGggdGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZSB0YWJsZQorCSBvZiB0cmFuc2xhdGlvbnMgaW4gdGhlIGZpbGUsIHdoZXJlIHdlIGNhbiBwdXQgdGhlIHBvaW50ZXJzCisJIHRvIHRoZSBjb252ZXJ0ZWQgc3RyaW5ncyBpbi4KKwkgVGhlcmUgaXMgYSBzbGlnaHQgY29tcGxpY2F0aW9uIHdpdGggcGx1cmFsIGVudHJpZXMuICBUaGV5CisJIGFyZSByZXByZXNlbnRlZCBieSBjb25zZWN1dGl2ZSBOVUwgdGVybWluYXRlZCBzdHJpbmdzLiAgV2UKKwkgaGFuZGxlIHRoaXMgY2FzZSBieSBjb252ZXJ0aW5nIFJFU1VMVExFTiBieXRlcywgaW5jbHVkaW5nCisJIE5VTHMuICAqLworCisgICAgICBpZiAoZG9tYWluLT5jb252X3RhYiA9PSBOVUxMCisJICAmJiAoKGRvbWFpbi0+Y29udl90YWIgPQorCQkgKGNoYXIgKiopIGNhbGxvYyAobnN0cmluZ3MgKyBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MsCisJCQkJICAgc2l6ZW9mIChjaGFyICopKSkKKwkgICAgICA9PSBOVUxMKSkKKwkvKiBNYXJrIHRoYXQgd2UgZGlkbid0IHN1Y2NlZWQgYWxsb2NhdGluZyBhIHRhYmxlLiAgKi8KKwlkb21haW4tPmNvbnZfdGFiID0gKGNoYXIgKiopIC0xOworCisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoZG9tYWluLT5jb252X3RhYiA9PSAoY2hhciAqKikgLTEsIDApKQorCS8qIE5vdGhpbmcgd2UgY2FuIGRvLCBubyBtb3JlIG1lbW9yeS4gICovCisJZ290byBjb252ZXJ0ZWQ7CisKKyAgICAgIGlmIChkb21haW4tPmNvbnZfdGFiW2FjdF0gPT0gTlVMTCkKKwl7CisJICAvKiBXZSBoYXZlbid0IHVzZWQgdGhpcyBzdHJpbmcgc28gZmFyLCBzbyBpdCBpcyBub3QKKwkgICAgIHRyYW5zbGF0ZWQgeWV0LiAgRG8gdGhpcyBub3cuICAqLworCSAgLyogV2UgdXNlIGEgYml0IG1vcmUgZWZmaWNpZW50IG1lbW9yeSBoYW5kbGluZy4KKwkgICAgIFdlIGFsbG9jYXRlIGFsd2F5cyBsYXJnZXIgYmxvY2tzIHdoaWNoIGdldCB1c2VkIG92ZXIKKwkgICAgIHRpbWUuICBUaGlzIGlzIGZhc3RlciB0aGFuIG1hbnkgc21hbGwgYWxsb2NhdGlvbnMuICAgKi8KKwkgIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZCAoc3RhdGljLCBsb2NrKQorIyBkZWZpbmUgSU5JVElBTF9CTE9DS19TSVpFCTQwODAKKwkgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpmcmVlbWVtOworCSAgc3RhdGljIHNpemVfdCBmcmVlbWVtX3NpemU7CisKKwkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmOworCSAgdW5zaWduZWQgY2hhciAqb3V0YnVmOworCSAgaW50IG1hbGxvY19jb3VudDsKKyMgaWZuZGVmIF9MSUJDCisJICB0cmFuc21lbV9ibG9ja190ICp0cmFuc21lbV9saXN0ID0gTlVMTDsKKyMgZW5kaWYKKworCSAgX19saWJjX2xvY2tfbG9jayAobG9jayk7CisKKwkgIGluYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcmVzdWx0OworCSAgb3V0YnVmID0gZnJlZW1lbSArIHNpemVvZiAoc2l6ZV90KTsKKworCSAgbWFsbG9jX2NvdW50ID0gMDsKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgdHJhbnNtZW1fYmxvY2tfdCAqbmV3bWVtOworIyBpZmRlZiBfTElCQworCSAgICAgIHNpemVfdCBub25fcmV2ZXJzaWJsZTsKKwkgICAgICBpbnQgcmVzOworCisJICAgICAgaWYgKGZyZWVtZW1fc2l6ZSA8IHNpemVvZiAoc2l6ZV90KSkKKwkJZ290byByZXNpemVfZnJlZW1lbTsKKworCSAgICAgIHJlcyA9IF9fZ2NvbnYgKGRvbWFpbi0+Y29udiwKKwkJCSAgICAgJmluYnVmLCBpbmJ1ZiArIHJlc3VsdGxlbiwKKwkJCSAgICAgJm91dGJ1ZiwKKwkJCSAgICAgb3V0YnVmICsgZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpLAorCQkJICAgICAmbm9uX3JldmVyc2libGUpOworCisJICAgICAgaWYgKHJlcyA9PSBfX0dDT05WX09LIHx8IHJlcyA9PSBfX0dDT05WX0VNUFRZX0lOUFVUKQorCQlicmVhazsKKworCSAgICAgIGlmIChyZXMgIT0gX19HQ09OVl9GVUxMX09VVFBVVCkKKwkJeworCQkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisJCSAgZ290byBjb252ZXJ0ZWQ7CisJCX0KKworCSAgICAgIGluYnVmID0gcmVzdWx0OworIyBlbHNlCisjICBpZiBIQVZFX0lDT05WCisJICAgICAgY29uc3QgY2hhciAqaW5wdHIgPSAoY29uc3QgY2hhciAqKSBpbmJ1ZjsKKwkgICAgICBzaXplX3QgaW5sZWZ0ID0gcmVzdWx0bGVuOworCSAgICAgIGNoYXIgKm91dHB0ciA9IChjaGFyICopIG91dGJ1ZjsKKwkgICAgICBzaXplX3Qgb3V0bGVmdDsKKworCSAgICAgIGlmIChmcmVlbWVtX3NpemUgPCBzaXplb2YgKHNpemVfdCkpCisJCWdvdG8gcmVzaXplX2ZyZWVtZW07CisKKwkgICAgICBvdXRsZWZ0ID0gZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpOworCSAgICAgIGlmIChpY29udiAoZG9tYWluLT5jb252LAorCQkJIChJQ09OVl9DT05TVCBjaGFyICoqKSAmaW5wdHIsICZpbmxlZnQsCisJCQkgJm91dHB0ciwgJm91dGxlZnQpCisJCSAgIT0gKHNpemVfdCkgKC0xKSkKKwkJeworCQkgIG91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG91dHB0cjsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGlmIChlcnJubyAhPSBFMkJJRykKKwkJeworCQkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisJCSAgZ290byBjb252ZXJ0ZWQ7CisJCX0KKyMgIGVuZGlmCisjIGVuZGlmCisKKwkgICAgcmVzaXplX2ZyZWVtZW06CisJICAgICAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgb3IgcmVzaXplIHRoZSBvbGQgb25lLiAgKi8KKwkgICAgICBpZiAobWFsbG9jX2NvdW50ID4gMCkKKwkJeworCQkgICsrbWFsbG9jX2NvdW50OworCQkgIGZyZWVtZW1fc2l6ZSA9IG1hbGxvY19jb3VudCAqIElOSVRJQUxfQkxPQ0tfU0laRTsKKwkJICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSByZWFsbG9jICh0cmFuc21lbV9saXN0LAorCQkJCQkJCSBmcmVlbWVtX3NpemUpOworIyBpZmRlZiBfTElCQworCQkgIGlmIChuZXdtZW0gIT0gTlVMTCkKKwkJICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgc3RydWN0IHRyYW5zbWVtX2xpc3QgKm9sZCA9IHRyYW5zbWVtX2xpc3Q7CisKKwkJICAgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7CisJCSAgICAgIGZyZWUgKG9sZCk7CisJCSAgICB9CisjIGVuZGlmCisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBtYWxsb2NfY291bnQgPSAxOworCQkgIGZyZWVtZW1fc2l6ZSA9IElOSVRJQUxfQkxPQ0tfU0laRTsKKwkJICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSBtYWxsb2MgKGZyZWVtZW1fc2l6ZSk7CisJCX0KKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3bWVtID09IE5VTEwsIDApKQorCQl7CisJCSAgZnJlZW1lbSA9IE5VTEw7CisJCSAgZnJlZW1lbV9zaXplID0gMDsKKwkJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworCQkgIGdvdG8gY29udmVydGVkOworCQl9CisKKyMgaWZkZWYgX0xJQkMKKwkgICAgICAvKiBBZGQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGJsb2NrcyB3ZSBoYXZlIHRvIGZyZWUKKyAgICAgICAgICAgICAgICAgYXQgc29tZSBwb2ludC4gICovCisJICAgICAgbmV3bWVtLT5uZXh0ID0gdHJhbnNtZW1fbGlzdDsKKwkgICAgICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOworCisJICAgICAgZnJlZW1lbSA9IG5ld21lbS0+ZGF0YTsKKwkgICAgICBmcmVlbWVtX3NpemUgLT0gb2Zmc2V0b2YgKHN0cnVjdCB0cmFuc21lbV9saXN0LCBkYXRhKTsKKyMgZWxzZQorCSAgICAgIHRyYW5zbWVtX2xpc3QgPSBuZXdtZW07CisJICAgICAgZnJlZW1lbSA9IG5ld21lbTsKKyMgZW5kaWYKKworCSAgICAgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7CisJICAgIH0KKworCSAgLyogV2UgaGF2ZSBub3cgaW4gb3VyIGJ1ZmZlciBhIGNvbnZlcnRlZCBzdHJpbmcuICBQdXQgdGhpcworCSAgICAgaW50byB0aGUgdGFibGUgb2YgY29udmVyc2lvbnMuICAqLworCSAgKihzaXplX3QgKikgZnJlZW1lbSA9IG91dGJ1ZiAtIGZyZWVtZW0gLSBzaXplb2YgKHNpemVfdCk7CisJICBkb21haW4tPmNvbnZfdGFiW2FjdF0gPSAoY2hhciAqKSBmcmVlbWVtOworCSAgLyogU2hyaW5rIGZyZWVtZW0sIGJ1dCBrZWVwIGl0IGFsaWduZWQuICAqLworCSAgZnJlZW1lbV9zaXplIC09IG91dGJ1ZiAtIGZyZWVtZW07CisJICBmcmVlbWVtID0gb3V0YnVmOworCSAgZnJlZW1lbSArPSBmcmVlbWVtX3NpemUgJiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOworCSAgZnJlZW1lbV9zaXplID0gZnJlZW1lbV9zaXplICYgfiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOworCisJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworCX0KKworICAgICAgLyogTm93IGRvbWFpbi0+Y29udl90YWJbYWN0XSBjb250YWlucyB0aGUgdHJhbnNsYXRpb24gb2YgYWxsCisJIHRoZSBwbHVyYWwgdmFyaWFudHMuICAqLworICAgICAgcmVzdWx0ID0gZG9tYWluLT5jb252X3RhYlthY3RdICsgc2l6ZW9mIChzaXplX3QpOworICAgICAgcmVzdWx0bGVuID0gKihzaXplX3QgKikgZG9tYWluLT5jb252X3RhYlthY3RdOworICAgIH0KKworIGNvbnZlcnRlZDoKKyAgLyogVGhlIHJlc3VsdCBzdHJpbmcgaXMgY29udmVydGVkLiAgKi8KKworI2VuZGlmIC8qIF9MSUJDIHx8IEhBVkVfSUNPTlYgKi8KKworICAqbGVuZ3RocCA9IHJlc3VsdGxlbjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBMb29rIHVwIGEgcGx1cmFsIHZhcmlhbnQuICAqLworc3RhdGljIGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK3BsdXJhbF9sb29rdXAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKwkgICAgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCit7CisgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW5kYXRhID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbi0+ZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgaW5kZXg7CisgIGNvbnN0IGNoYXIgKnA7CisKKyAgaW5kZXggPSBwbHVyYWxfZXZhbCAoZG9tYWluZGF0YS0+cGx1cmFsLCBuKTsKKyAgaWYgKGluZGV4ID49IGRvbWFpbmRhdGEtPm5wbHVyYWxzKQorICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhbmQgdGhlCisgICAgICAgZ2l2ZW4gbWF4aW11bSB2YWx1ZSBkbyBub3QgbWF0Y2guICAqLworICAgIGluZGV4ID0gMDsKKworICAvKiBTa2lwIElOREVYIHN0cmluZ3MgYXQgVFJBTlNMQVRJT04uICAqLworICBwID0gdHJhbnNsYXRpb247CisgIHdoaWxlIChpbmRleC0tID4gMCkKKyAgICB7CisjaWZkZWYgX0xJQkMKKyAgICAgIHAgPSBfX3Jhd21lbWNociAocCwgJ1wwJyk7CisjZWxzZQorICAgICAgcCA9IHN0cmNociAocCwgJ1wwJyk7CisjZW5kaWYKKyAgICAgIC8qIEFuZCBza2lwIG92ZXIgdGhlIE5VTCBieXRlLiAgKi8KKyAgICAgIHArKzsKKworICAgICAgaWYgKHAgPj0gdHJhbnNsYXRpb24gKyB0cmFuc2xhdGlvbl9sZW4pCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSXQgbWVhbnMgdGhlIHBsdXJhbCBleHByZXNzaW9uCisJICAgZXZhbHVhdGVkIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB2YXJpYW50cworCSAgIGF2YWlsYWJsZSBmb3IgTVNHSUQxLiAgKi8KKwlyZXR1cm4gKGNoYXIgKikgdHJhbnNsYXRpb247CisgICAgfQorICByZXR1cm4gKGNoYXIgKikgcDsKK30KKworI2lmbmRlZiBfTElCQworLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGUgQ0FURUdPUlkuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK2NhdGVnb3J5X3RvX25hbWUgKGludCBjYXRlZ29yeSkKK3sKKyAgY29uc3QgY2hhciAqcmV0dmFsOworCisgIHN3aXRjaCAoY2F0ZWdvcnkpCisgIHsKKyNpZmRlZiBMQ19DT0xMQVRFCisgIGNhc2UgTENfQ09MTEFURToKKyAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19DVFlQRQorICBjYXNlIExDX0NUWVBFOgorICAgIHJldHZhbCA9ICJMQ19DVFlQRSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19NT05FVEFSWQorICBjYXNlIExDX01PTkVUQVJZOgorICAgIHJldHZhbCA9ICJMQ19NT05FVEFSWSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19OVU1FUklDCisgIGNhc2UgTENfTlVNRVJJQzoKKyAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19USU1FCisgIGNhc2UgTENfVElNRToKKyAgICByZXR2YWwgPSAiTENfVElNRSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19NRVNTQUdFUworICBjYXNlIExDX01FU1NBR0VTOgorICAgIHJldHZhbCA9ICJMQ19NRVNTQUdFUyI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19SRVNQT05TRQorICBjYXNlIExDX1JFU1BPTlNFOgorICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19BTEwKKyAgY2FzZSBMQ19BTEw6CisgICAgLyogVGhpcyBtaWdodCBub3QgbWFrZSBzZW5zZSBidXQgaXMgcGVyaGFwcyBiZXR0ZXIgdGhhbiBhbnkgb3RoZXIKKyAgICAgICB2YWx1ZS4gICovCisgICAgcmV0dmFsID0gIkxDX0FMTCI7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICAvKiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGZvciBhIGRlZmF1bHQgdmFsdWUgbGV0IG1lIGtub3cuICAqLworICAgIHJldHZhbCA9ICJMQ19YWFgiOworICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKiBHdWVzcyB2YWx1ZSBvZiBjdXJyZW50IGxvY2FsZSBmcm9tIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK2d1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKK3sKKyAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CisgIGNvbnN0IGNoYXIgKnJldHZhbDsKKworICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAorICAgICB2YXJpYWJsZS4gIEJ1dCB3ZSBkb24ndCB1c2UgdGhlIHZhbHVlIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgbG9jYWxlIGlzIHRoZSBDIGxvY2FsZS4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KKyAgbGFuZ3VhZ2UgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOworICBpZiAobGFuZ3VhZ2UgIT0gTlVMTCAmJiBsYW5ndWFnZVswXSA9PSAnXDAnKQorICAgIGxhbmd1YWdlID0gTlVMTDsKKworICAvKiBXZSBoYXZlIHRvIHByb2NlZWQgd2l0aCB0aGUgUE9TSVggbWV0aG9kcyBvZiBsb29raW5nIHRvIGBMQ19BTEwnLAorICAgICBgTENfeHh4JywgYW5kIGBMQU5HJy4gIE9uIHNvbWUgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZQorICAgICBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLworI2lmZGVmIF9MSUJDCisgIHJldHZhbCA9IF9fY3VycmVudF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnkpOworI2Vsc2UKKyAgcmV0dmFsID0gX25sX2xvY2FsZV9uYW1lIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKKyNlbmRpZgorCisgIC8qIElnbm9yZSBMQU5HVUFHRSBpZiB0aGUgbG9jYWxlIGlzIHNldCB0byAiQyIgYmVjYXVzZQorICAgICAxLiAiQyIgbG9jYWxlIHVzdWFsbHkgdXNlcyB0aGUgQVNDSUkgZW5jb2RpbmcsIGFuZCBtb3N0IGludGVybmF0aW9uYWwKKwltZXNzYWdlcyB1c2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoZXNlIGNoYXJhY3RlcnMgZ2V0IGRpc3BsYXllZAorCWFzIHF1ZXN0aW9uIG1hcmtzIChpZiB1c2luZyBnbGliYydzIGljb252KCkpIG9yIGFzIGludmFsaWQgOC1iaXQKKwljaGFyYWN0ZXJzIChiZWNhdXNlIG90aGVyIGljb252KClzIHJlZnVzZSB0byBjb252ZXJ0IG1vc3Qgbm9uLUFTQ0lJCisJY2hhcmFjdGVycyB0byBBU0NJSSkuIEluIGFueSBjYXNlLCB0aGUgb3V0cHV0IGlzIHVnbHkuCisgICAgIDIuIFRoZSBwcmVjaXNlIG91dHB1dCBvZiBzb21lIHByb2dyYW1zIGluIHRoZSAiQyIgbG9jYWxlIGlzIHNwZWNpZmllZAorCWJ5IFBPU0lYIGFuZCBzaG91bGQgbm90IGRlcGVuZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbGlrZQorCSJMQU5HVUFHRSIuICBXZSBhbGxvdyBzdWNoIHByb2dyYW1zIHRvIHVzZSBnZXR0ZXh0KCkuICAqLworICByZXR1cm4gbGFuZ3VhZ2UgIT0gTlVMTCAmJiBzdHJjbXAgKHJldHZhbCwgIkMiKSAhPSAwID8gbGFuZ3VhZ2UgOiByZXR2YWw7Cit9CisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisvKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQorICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKKyAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCisgICB0byBiZSBkZWZpbmVkLiAgKi8KKyNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqCitzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorICAgIC8qIERvIG5vdGhpbmcuICovIDsKKyAgcmV0dXJuIGRlc3QgLSAxOworfQorI2VuZGlmCisKKyNpZiAhX0xJQkMgJiYgIUhBVkVfTUVNUENQWQorc3RhdGljIHZvaWQgKgorbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKyAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgbikgKyBuKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBfTElCQworLyogSWYgd2Ugd2FudCB0byBmcmVlIGFsbCByZXNvdXJjZXMgd2UgaGF2ZSB0byBkbyBzb21lIHdvcmsgYXQKKyAgIHByb2dyYW0ncyBlbmQuICAqLworbGliY19mcmVlcmVzX2ZuIChmcmVlX21lbSkKK3sKKyAgdm9pZCAqb2xkOworCisgIHdoaWxlIChfbmxfZG9tYWluX2JpbmRpbmdzICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGJpbmRpbmcgKm9sZHAgPSBfbmxfZG9tYWluX2JpbmRpbmdzOworICAgICAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IF9ubF9kb21haW5fYmluZGluZ3MtPm5leHQ7CisgICAgICBpZiAob2xkcC0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJLyogWWVzLCB0aGlzIGlzIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KKwlmcmVlIChvbGRwLT5kaXJuYW1lKTsKKyAgICAgIGZyZWUgKG9sZHAtPmNvZGVzZXQpOworICAgICAgZnJlZSAob2xkcCk7CisgICAgfQorCisgIGlmIChfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKKyAgICAvKiBZZXMsIGFnYWluIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KKyAgICBmcmVlICgoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbik7CisKKyAgLyogUmVtb3ZlIHRoZSBzZWFyY2ggdHJlZSB3aXRoIHRoZSBrbm93biB0cmFuc2xhdGlvbnMuICAqLworICBfX3RkZXN0cm95IChyb290LCBmcmVlKTsKKyAgcm9vdCA9IE5VTEw7CisKKyAgd2hpbGUgKHRyYW5zbWVtX2xpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBvbGQgPSB0cmFuc21lbV9saXN0OworICAgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7CisgICAgICBmcmVlIChvbGQpOworICAgIH0KK30KKyNlbmRpZgotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZGNuZ2V0dGV4dC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvZGNuZ2V0dGV4dC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzc1NzQ1MDQ4IC0wNDAwCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY25nZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENOR0VUVEVYVCBsaWJpbnRsX2RjbmdldHRleHQKKyMgZGVmaW5lIERDSUdFVFRFWFQgbGliaW50bF9kY2lnZXR0ZXh0CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisgICBsb2NhbGUuICAqLworY2hhciAqCitEQ05HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKwkgICAgaW50IGNhdGVnb3J5KQoreworICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIDEsIG4sIGNhdGVnb3J5KTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fZGNuZ2V0dGV4dCwgZGNuZ2V0dGV4dCk7CisjZW5kaWYKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2RnZXR0ZXh0LmMJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9kZ2V0dGV4dC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzgwNzQ0Mjg4IC0wNDAwCkBAIC0xLDMyICsxLDMzIEBACi0vKiBkZ2V0dGV4dC5jIC0tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCiAKLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLwogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogIyBpbmNsdWRlIDxjb25maWcuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CiAKICNpZmRlZiBfTElCQwogIyBpbmNsdWRlIDxsaWJpbnRsLmg+CiAjZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKICNlbmRpZgogCiAvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCkBAIC0zNywxOCArMzgsMTYgQEAKICAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCiAjaWZkZWYgX0xJQkMKICMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAorIyBkZWZpbmUgRENHRVRURVhUIElOVFVTRShfX2RjZ2V0dGV4dCkKICNlbHNlCi0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCi0jIGRlZmluZSBEQ0dFVFRFWFQgZGNnZXR0ZXh0X18KKyMgZGVmaW5lIERHRVRURVhUIGxpYmludGxfZGdldHRleHQKKyMgZGVmaW5lIERDR0VUVEVYVCBsaWJpbnRsX2RjZ2V0dGV4dAogI2VuZGlmCiAKIC8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50CiAgICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwogY2hhciAqCi1ER0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOworREdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKm1zZ2lkKQogewogICByZXR1cm4gRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpOwogfQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZG5nZXR0ZXh0LmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9kbmdldHRleHQuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjM4NTc0MzUyOCAtMDQwMApAQCAtMCwwICsxLDU5IEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZG5nZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEROR0VUVEVYVCBfX2RuZ2V0dGV4dAorIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKKyNlbHNlCisjIGRlZmluZSBETkdFVFRFWFQgbGliaW50bF9kbmdldHRleHQKKyMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZSBhbmQgc2tpcCBtZXNzYWdlIGFjY29yZGluZyB0byB0aGUgcGx1cmFsIGZvcm0uICAqLworY2hhciAqCitETkdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHJldHVybiBEQ05HRVRURVhUIChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19kbmdldHRleHQsIGRuZ2V0dGV4dCk7CisjZW5kaWYKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2V2YWwtcGx1cmFsLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9ldmFsLXBsdXJhbC5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuMzkwNzQyNzY4IC0wNDAwCkBAIC0wLDAgKzEsMTA4IEBACisvKiBQbHVyYWwgZXhwcmVzc2lvbiBldmFsdWF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIFNUQVRJQworI2RlZmluZSBTVEFUSUMgc3RhdGljCisjZW5kaWYKKworLyogRXZhbHVhdGUgdGhlIHBsdXJhbCBleHByZXNzaW9uIGFuZCByZXR1cm4gYW4gaW5kZXggdmFsdWUuICAqLworU1RBVElDCit1bnNpZ25lZCBsb25nIGludAoraW50ZXJuYWxfZnVuY3Rpb24KK3BsdXJhbF9ldmFsIChzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwgdW5zaWduZWQgbG9uZyBpbnQgbikKK3sKKyAgc3dpdGNoIChwZXhwLT5uYXJncykKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgc3dpdGNoIChwZXhwLT5vcGVyYXRpb24pCisJeworCWNhc2UgdmFyOgorCSAgcmV0dXJuIG47CisJY2FzZSBudW06CisJICByZXR1cm4gcGV4cC0+dmFsLm51bTsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgeworCS8qIHBleHAtPm9wZXJhdGlvbiBtdXN0IGJlIGxub3QuICAqLworCXVuc2lnbmVkIGxvbmcgaW50IGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7CisJcmV0dXJuICEgYXJnOworICAgICAgfQorICAgIGNhc2UgMjoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIGludCBsZWZ0YXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKKwlpZiAocGV4cC0+b3BlcmF0aW9uID09IGxvcikKKwkgIHJldHVybiBsZWZ0YXJnIHx8IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1sxXSwgbik7CisJZWxzZSBpZiAocGV4cC0+b3BlcmF0aW9uID09IGxhbmQpCisJICByZXR1cm4gbGVmdGFyZyAmJiBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworCWVsc2UKKwkgIHsKKwkgICAgdW5zaWduZWQgbG9uZyBpbnQgcmlnaHRhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworCisJICAgIHN3aXRjaCAocGV4cC0+b3BlcmF0aW9uKQorCSAgICAgIHsKKwkgICAgICBjYXNlIG11bHQ6CisJCXJldHVybiBsZWZ0YXJnICogcmlnaHRhcmc7CisJICAgICAgY2FzZSBkaXZpZGU6CisjaWYgIUlOVERJVjBfUkFJU0VTX1NJR0ZQRQorCQlpZiAocmlnaHRhcmcgPT0gMCkKKwkJICByYWlzZSAoU0lHRlBFKTsKKyNlbmRpZgorCQlyZXR1cm4gbGVmdGFyZyAvIHJpZ2h0YXJnOworCSAgICAgIGNhc2UgbW9kdWxlOgorI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKKwkJaWYgKHJpZ2h0YXJnID09IDApCisJCSAgcmFpc2UgKFNJR0ZQRSk7CisjZW5kaWYKKwkJcmV0dXJuIGxlZnRhcmcgJSByaWdodGFyZzsKKwkgICAgICBjYXNlIHBsdXM6CisJCXJldHVybiBsZWZ0YXJnICsgcmlnaHRhcmc7CisJICAgICAgY2FzZSBtaW51czoKKwkJcmV0dXJuIGxlZnRhcmcgLSByaWdodGFyZzsKKwkgICAgICBjYXNlIGxlc3NfdGhhbjoKKwkJcmV0dXJuIGxlZnRhcmcgPCByaWdodGFyZzsKKwkgICAgICBjYXNlIGdyZWF0ZXJfdGhhbjoKKwkJcmV0dXJuIGxlZnRhcmcgPiByaWdodGFyZzsKKwkgICAgICBjYXNlIGxlc3Nfb3JfZXF1YWw6CisJCXJldHVybiBsZWZ0YXJnIDw9IHJpZ2h0YXJnOworCSAgICAgIGNhc2UgZ3JlYXRlcl9vcl9lcXVhbDoKKwkJcmV0dXJuIGxlZnRhcmcgPj0gcmlnaHRhcmc7CisJICAgICAgY2FzZSBlcXVhbDoKKwkJcmV0dXJuIGxlZnRhcmcgPT0gcmlnaHRhcmc7CisJICAgICAgY2FzZSBub3RfZXF1YWw6CisJCXJldHVybiBsZWZ0YXJnICE9IHJpZ2h0YXJnOworCSAgICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKwkvKiBOT1RSRUFDSEVEICovCisJYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAzOgorICAgICAgeworCS8qIHBleHAtPm9wZXJhdGlvbiBtdXN0IGJlIHFtb3AuICAqLworCXVuc2lnbmVkIGxvbmcgaW50IGJvb2xhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOworCXJldHVybiBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbYm9vbGFyZyA/IDEgOiAyXSwgbik7CisgICAgICB9CisgICAgfQorICAvKiBOT1RSRUFDSEVEICovCisgIHJldHVybiAwOworfQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZXhwbG9kZW5hbWUuYwkxOTk4LTA0LTI2IDA5OjIyOjM3LjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2V4cGxvZGVuYW1lLmMJMjAwNC0wOS0xMiAxNDo0MDozNC4zOTU3NDIwMDggLTA0MDAKQEAgLTEsMTkgKzEsMjAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCiAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICAgIGFueSBsYXRlciB2ZXJzaW9uLgogCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKICMgaW5jbHVkZSA8Y29uZmlnLmg+CkBAIC0zNiwxOCArMzcsMjMgQEAKIAogLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwogCitjaGFyICoKK19ubF9maW5kX2xhbmd1YWdlIChjb25zdCBjaGFyICpuYW1lKQoreworICB3aGlsZSAobmFtZVswXSAhPSAnXDAnICYmIG5hbWVbMF0gIT0gJ18nICYmIG5hbWVbMF0gIT0gJ0AnCisJICYmIG5hbWVbMF0gIT0gJysnICYmIG5hbWVbMF0gIT0gJywnKQorICAgICsrbmFtZTsKKworICByZXR1cm4gKGNoYXIgKikgbmFtZTsKK30KKworCiBpbnQKLV9ubF9leHBsb2RlX25hbWUgKG5hbWUsIGxhbmd1YWdlLCBtb2RpZmllciwgdGVycml0b3J5LCBjb2Rlc2V0LAotCQkgIG5vcm1hbGl6ZWRfY29kZXNldCwgc3BlY2lhbCwgc3BvbnNvciwgcmV2aXNpb24pCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipsYW5ndWFnZTsKLSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyOwotICAgICBjb25zdCBjaGFyICoqdGVycml0b3J5OwotICAgICBjb25zdCBjaGFyICoqY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWw7Ci0gICAgIGNvbnN0IGNoYXIgKipzcG9uc29yOwotICAgICBjb25zdCBjaGFyICoqcmV2aXNpb247CitfbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLAorCQkgIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwgY29uc3QgY2hhciAqKm1vZGlmaWVyLAorCQkgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAorCQkgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsIGNvbnN0IGNoYXIgKipzcGVjaWFsLAorCQkgIGNvbnN0IGNoYXIgKipzcG9uc29yLCBjb25zdCBjaGFyICoqcmV2aXNpb24pCiB7CiAgIGVudW0geyB1bmRlY2lkZWQsIHhwZywgY2VuIH0gc3ludGF4OwogICBjaGFyICpjcDsKQEAgLTY3LDkgKzczLDcgQEAKICAgbWFzayA9IDA7CiAgIHN5bnRheCA9IHVuZGVjaWRlZDsKICAgKmxhbmd1YWdlID0gY3AgPSBuYW1lOwotICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycgJiYgY3BbMF0gIT0gJ0AnCi0JICYmIGNwWzBdICE9ICcrJyAmJiBjcFswXSAhPSAnLCcpCi0gICAgKytjcDsKKyAgY3AgPSBfbmxfZmluZF9sYW5ndWFnZSAoKmxhbmd1YWdlKTsKIAogICBpZiAoKmxhbmd1YWdlID09IGNwKQogICAgIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZTogbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZC4gIFVzZQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZmluZGRvbWFpbi5jCTE5OTgtMDQtMjYgMDk6MjI6MzYuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvZmluZGRvbWFpbi5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNDE1NzM4OTY4IC0wNDAwCkBAIC0xLDY0ICsxLDQwIEBACiAvKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUub3JnPiwgMTk5NS4KIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogICAgYW55IGxhdGVyIHZlcnNpb24uCiAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLwogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogIyBpbmNsdWRlIDxjb25maWcuaD4KICNlbmRpZgogCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwogIyBpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgogI2luY2x1ZGUgImdldHRleHRQLmgiCiAjaWZkZWYgX0xJQkMKICMgaW5jbHVkZSA8bGliaW50bC5oPgogI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCiAjZW5kaWYKIAogLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwpAQCAtNzAsMTAgKzQ2LDkgQEAKICAgIHRoZSBET01BSU5OQU1FIGFuZCBDQVRFR09SWSBwYXJhbWV0ZXJzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudGx5CiAgICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCiBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgbG9jYWxlLCBkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotICAgICBjaGFyICpsb2NhbGU7Ci0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7CitpbnRlcm5hbF9mdW5jdGlvbgorX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpkaXJuYW1lLCBjaGFyICpsb2NhbGUsCisJCSBjb25zdCBjaGFyICpkb21haW5uYW1lLCBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKIHsKICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwogICBjb25zdCBjaGFyICpsYW5ndWFnZTsKQEAgLTk1LDkgKzcwLDkgQEAKIAogCWxhbmd1YWdlW190ZXJyaXRvcnldWythdWRpZW5jZV1bK3NwZWNpYWxdWyxbc3BvbnNvcl1bX3JldmlzaW9uXV0KIAotICAgICBCZXNpZGUgdGhlIGZpcnN0IGFsbCBvZiB0aGVtIGFyZSBhbGxvd2VkIHRvIGJlIG1pc3NpbmcuICBJZiB0aGUKLSAgICAgZnVsbCBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZCwgdGhlIGxlc3Mgc3BlY2lmaWMgb25lIGFyZQotICAgICBsb29rZWQgZm9yLiAgVGhlIHZhcmlvdXMgcGFydCB3aWxsIGJlIHN0cmlwcGVkIG9mIGFjY29yZGluZyB0bworICAgICBCZXNpZGUgdGhlIGZpcnN0IHBhcnQgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmCisgICAgIHRoZSBmdWxsIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLCB0aGUgbGVzcyBzcGVjaWZpYyBvbmUgYXJlCisgICAgIGxvb2tlZCBmb3IuICBUaGUgdmFyaW91cyBwYXJ0cyB3aWxsIGJlIHN0cmlwcGVkIG9mZiBhY2NvcmRpbmcgdG8KICAgICAgdGhlIGZvbGxvd2luZyBvcmRlcjoKIAkJKDEpIHJldmlzaW9uCiAJCSgyKSBzcG9uc29yCkBAIC0xMTksNyArOTQsNyBAQAogICAgICAgaW50IGNudDsKIAogICAgICAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQotCV9ubF9sb2FkX2RvbWFpbiAocmV0dmFsKTsKKwlfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7CiAKICAgICAgIGlmIChyZXR2YWwtPmRhdGEgIT0gTlVMTCkKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTI3LDcgKzEwMiw3IEBACiAgICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCiAJewogCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKLQkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdKTsKKwkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLCBkb21haW5iaW5kaW5nKTsKIAogCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKIAkgICAgYnJlYWs7CkBAIC0xNDIsMTIgKzExNywxOCBAQAogICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7CiAgIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQogICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKyAgICAgIGxvY2FsZSA9IHN0cmR1cCAoYWxpYXNfdmFsdWUpOworICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworI2Vsc2UKICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7CiAgICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CiAgICAgICBpZiAobG9jYWxlID09IE5VTEwpCiAJcmV0dXJuIE5VTEw7CiAKICAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKKyNlbmRpZgogICAgIH0KIAogICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKQEAgLTE2OCwxNCArMTQ5LDE0IEBACiAgICAgcmV0dXJuIE5VTEw7CiAKICAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQotICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsKTsKKyAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7CiAgIGlmIChyZXR2YWwtPmRhdGEgPT0gTlVMTCkKICAgICB7CiAgICAgICBpbnQgY250OwogICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQogCXsKIAkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCi0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSk7CisJICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSwgZG9tYWluYmluZGluZyk7CiAJICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQogCSAgICBicmVhazsKIAl9CkBAIC0xODUsNSArMTY2LDI3IEBACiAgIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQogICAgIGZyZWUgKGxvY2FsZSk7CiAKKyAgLyogVGhlIHNwYWNlIGZvciBub3JtYWxpemVkX2NvZGVzZXQgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdC4gICovCisgIGlmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkKKyAgICBmcmVlICgodm9pZCAqKSBub3JtYWxpemVkX2NvZGVzZXQpOworCiAgIHJldHVybiByZXR2YWw7CiB9CisKKworI2lmZGVmIF9MSUJDCitsaWJjX2ZyZWVyZXNfZm4gKGZyZWVfbWVtKQoreworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpydW5wID0gX25sX2xvYWRlZF9kb21haW5zOworCisgIHdoaWxlIChydW5wICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqaGVyZSA9IHJ1bnA7CisgICAgICBpZiAocnVucC0+ZGF0YSAhPSBOVUxMKQorCV9ubF91bmxvYWRfZG9tYWluICgoc3RydWN0IGxvYWRlZF9kb21haW4gKikgcnVucC0+ZGF0YSk7CisgICAgICBydW5wID0gcnVucC0+bmV4dDsKKyAgICAgIGZyZWUgKChjaGFyICopIGhlcmUtPmZpbGVuYW1lKTsKKyAgICAgIGZyZWUgKGhlcmUpOworICAgIH0KK30KKyNlbmRpZgotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZ2V0dGV4dC5jCTE5OTgtMDQtMjYgMDk6MjI6MzYuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvZ2V0dGV4dC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNDIwNzM4MjA4IC0wNDAwCkBAIC0xLDE5ICsxLDIwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICAgIGFueSBsYXRlciB2ZXJzaW9uLgogCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKICMgaW5jbHVkZSA8Y29uZmlnLmg+CkBAIC0yMywyMSArMjQsMTQgQEAKICMgZGVmaW5lIF9fbmVlZF9OVUxMCiAjIGluY2x1ZGUgPHN0ZGRlZi5oPgogI2Vsc2UKLSMgaWZkZWYgU1REQ19IRUFERVJTCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLwotIyBlbHNlCi0jICBpZmRlZiBIQVZFX1NUUklOR19ICi0jICAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBlbHNlCi0jICAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jICBlbmRpZgotIyBlbmRpZgorIyBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLwogI2VuZGlmCiAKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgogI2lmZGVmIF9MSUJDCiAjIGluY2x1ZGUgPGxpYmludGwuaD4KICNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgogI2VuZGlmCiAKIC8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KQEAgLTQ4LDIwICs0MiwxOSBAQAogICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KICNpZmRlZiBfTElCQwogIyBkZWZpbmUgR0VUVEVYVCBfX2dldHRleHQKLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKKyMgZGVmaW5lIERDR0VUVEVYVCBJTlRVU0UoX19kY2dldHRleHQpCiAjZWxzZQotIyBkZWZpbmUgR0VUVEVYVCBnZXR0ZXh0X18KLSMgZGVmaW5lIERHRVRURVhUIGRnZXR0ZXh0X18KKyMgZGVmaW5lIEdFVFRFWFQgbGliaW50bF9nZXR0ZXh0CisjIGRlZmluZSBEQ0dFVFRFWFQgbGliaW50bF9kY2dldHRleHQKICNlbmRpZgogCiAvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAogICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKICAgIHRleHQpLiAgKi8KIGNoYXIgKgotR0VUVEVYVCAobXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOworR0VUVEVYVCAoY29uc3QgY2hhciAqbXNnaWQpCiB7Ci0gIHJldHVybiBER0VUVEVYVCAoTlVMTCwgbXNnaWQpOworICByZXR1cm4gRENHRVRURVhUIChOVUxMLCBtc2dpZCwgTENfTUVTU0FHRVMpOwogfQogCiAjaWZkZWYgX0xJQkMKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2dldHRleHQuaAkxOTk4LTA0LTI2IDA5OjIyOjM1LjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHQuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMApAQCAtMSwxMDUgKzAsMCBAQAotLyogSW50ZXJuYWwgaGVhZGVyIGZvciBHTlUgZ2V0dGV4dCBpbnRlcm5hdGlvbmFsaXphdGlvbiBmdW5jdGlvbnMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUX0gKLSNkZWZpbmUgX0dFVFRFWFRfSCAxCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgSEFWRV9MSU1JVFNfSCB8fCBfTElCQwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KLSNkZWZpbmUgX01BR0lDIDB4OTUwNDEyZGUKLSNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQotCi0vKiBSZXZpc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSB1c2VkIC5tbyAoYmluYXJ5KSBmaWxlIGZvcm1hdC4gICovCi0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29udG9ydGlvbnMgYXJlIGFuIGF0dGVtcHQgdG8gdXNlIHRoZSBDIHByZXByb2Nlc3NvcgotICAgdG8gZGV0ZXJtaW5lIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUgdGhhdCBpcyAzMiBiaXRzIHdpZGUuICBBbgotICAgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8gdXNlIGF1dG9jb25mJ3MgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvLCBidXQKLSAgIGRvaW5nIHRoYXQgd291bGQgcmVxdWlyZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBpbGUgYW5kICpydW4qCi0gICB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUuICBMb2NhbGx5IHJ1bm5pbmcgY3Jvc3MtY29tcGlsZWQgZXhlY3V0YWJsZXMKLSAgIGlzIHVzdWFsbHkgbm90IHBvc3NpYmxlLiAgKi8KLQotI2lmIF9fU1REQ19fCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCi0jZWxzZQotIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyAweEZGRkZGRkZGCi0jZW5kaWYKLQotLyogSWYgVUlOVF9NQVggaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIGl0J3MgYSAzMi1iaXQgdHlwZS4KLSAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQotICAgdGhhdCBkb2Vzbid0IGluY2x1ZGUgMTYtYml0IHN5c3RlbXMsIGFuZCBvbmx5IG1vZGVybiBzeXN0ZW1zCi0gICAodGhhdCBjZXJ0YWlubHkgaGF2ZSA8bGltaXRzLmg+KSBoYXZlIDY0Ky1iaXQgaW50ZWdyYWwgdHlwZXMuICAqLwotCi0jaWZuZGVmIFVJTlRfTUFYCi0jIGRlZmluZSBVSU5UX01BWCBVSU5UX01BWF8zMl9CSVRTCi0jZW5kaWYKLQotI2lmIFVJTlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKLSNlbHNlCi0jIGlmIFVTSFJUX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7Ci0jIGVsc2UKLSMgIGlmIFVMT05HX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKLSMgIGVsc2UKLSAgLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIGludGVuZGVkIHRvIHRocm93IGFuIGVycm9yLiAgVXNpbmcgI2Vycm9yIGlzCi0gICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLwotICAiQ2Fubm90IGRldGVybWluZSB1bnNpZ25lZCAzMi1iaXQgZGF0YSB0eXBlLiIKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vKiBIZWFkZXIgZm9yIGJpbmFyeSAubW8gZmlsZSBmb3JtYXQuICAqLwotc3RydWN0IG1vX2ZpbGVfaGVhZGVyCi17Ci0gIC8qIFRoZSBtYWdpYyBudW1iZXIuICAqLwotICBubHNfdWludDMyIG1hZ2ljOwotICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCi0gIG5sc191aW50MzIgcmV2aXNpb247Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBwYWlycy4gICovCi0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCi0gIG5sc191aW50MzIgb3JpZ190YWJfb2Zmc2V0OwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0aW9uIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIHRyYW5zX3RhYl9vZmZzZXQ7Ci0gIC8qIFNpemUgb2YgaGFzaGluZyB0YWJsZS4gICovCi0gIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKLSAgLyogT2Zmc2V0IG9mIGZpcnN0IGhhc2hpbmcgZW50cnkuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKLX07Ci0KLXN0cnVjdCBzdHJpbmdfZGVzYwotewotICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZy4gICovCi0gIG5sc191aW50MzIgbGVuZ3RoOwotICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLwotICBubHNfdWludDMyIG9mZnNldDsKLX07Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYJLyogZ2V0dGV4dC5oICAqLwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvZ2V0dGV4dFAuaAkxOTk4LTA0LTI2IDA5OjIyOjM1LjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHRQLmgJMjAwNC0wOS0xMiAxNDo0MDozNC40MjY3MzcyOTYgLTA0MDAKQEAgLTEsMzMgKzEsNTMgQEAKLS8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBnZXR0ZXh0IGxpYnJhcnkKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBsaWJpbnRsIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogICAgYW55IGxhdGVyIHZlcnNpb24uCiAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLwogCiAjaWZuZGVmIF9HRVRURVhUUF9ICiAjZGVmaW5lIF9HRVRURVhUUF9ICiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4JCS8qIEdldCBzaXplX3QuICAqLworCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSAiLi4vaWNvbnYvZ2NvbnZfaW50LmgiCisjZWxzZQorIyBpZiBIQVZFX0lDT05WCisjICBpbmNsdWRlIDxpY29udi5oPgorIyBlbmRpZgorI2VuZGlmCisKICNpbmNsdWRlICJsb2FkaW5mby5oIgogCisjaW5jbHVkZSAiZ21vLmgiCQkvKiBHZXQgbmxzX3VpbnQzMi4gICovCisKIC8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KIAotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCisjaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCisjIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgorI2VuZGlmCisKKyNpZm5kZWYgYXR0cmlidXRlX2hpZGRlbgorIyBkZWZpbmUgYXR0cmlidXRlX2hpZGRlbgorI2VuZGlmCisKKy8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKKyAgIGFsbW9zdCBhbHdheXMgdHJ1ZSBvciBhbG1vc3QgYWx3YXlzIGZhbHNlLiAgKi8KKyNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAorIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQogI2VuZGlmCiAKICNpZm5kZWYgVwpAQCAtMzUsMzggKzU1LDE2MCBAQAogI2VuZGlmCiAKIAotc3RhdGljIG5sc191aW50MzIgU1dBUCBQQVJBTVMgKChubHNfdWludDMyIGkpKTsKLQorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjIGRlZmluZSBTV0FQKGkpIGJzd2FwXzMyIChpKQorI2Vsc2UKIHN0YXRpYyBpbmxpbmUgbmxzX3VpbnQzMgogU1dBUCAoaSkKICAgICAgbmxzX3VpbnQzMiBpOwogewogICByZXR1cm4gKGkgPDwgMjQpIHwgKChpICYgMHhmZjAwKSA8PCA4KSB8ICgoaSA+PiA4KSAmIDB4ZmYwMCkgfCAoaSA+PiAyNCk7CiB9CisjZW5kaWYKKwogCisvKiBJbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2Ygc3lzdGVtIGRlcGVuZGVudCBzdHJpbmcuICAqLworc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYworeworICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLworICBzaXplX3QgbGVuZ3RoOworICAvKiBQb2ludGVyIHRvIGFkZHJlc3NlZCBzdHJpbmcuICAqLworICBjb25zdCBjaGFyICpwb2ludGVyOworfTsKIAorLyogVGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9wZW5lZCBtZXNzYWdlIGNhdGFsb2cuICAqLwogc3RydWN0IGxvYWRlZF9kb21haW4KIHsKKyAgLyogUG9pbnRlciB0byBtZW1vcnkgY29udGFpbmluZyB0aGUgLm1vIGZpbGUuICAqLwogICBjb25zdCBjaGFyICpkYXRhOworICAvKiAxIGlmIHRoZSBtZW1vcnkgaXMgbW1hcCgpZWQsIDAgaWYgdGhlIG1lbW9yeSBpcyBtYWxsb2MoKWVkLiAgKi8KKyAgaW50IHVzZV9tbWFwOworICAvKiBTaXplIG9mIG1tYXAoKWVkIG1lbW9yeS4gICovCisgIHNpemVfdCBtbWFwX3NpemU7CisgIC8qIDEgaWYgdGhlIC5tbyBmaWxlIHVzZXMgYSBkaWZmZXJlbnQgZW5kaWFubmVzcyB0aGFuIHRoaXMgbWFjaGluZS4gICovCiAgIGludCBtdXN0X3N3YXA7CisgIC8qIFBvaW50ZXIgdG8gYWRkaXRpb25hbCBtYWxsb2MoKWVkIG1lbW9yeS4gICovCisgIHZvaWQgKm1hbGxvY2VkOworCisgIC8qIE51bWJlciBvZiBzdGF0aWMgc3RyaW5ncyBwYWlycy4gICovCiAgIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqb3JpZ190YWI7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIG9yaWdpbmFsIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLworICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncyBpbiB0aGUgZmlsZS4gICovCisgIGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOworCisgIC8qIE51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLworICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7CisgIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLworICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICpvcmlnX3N5c2RlcF90YWI7CisgIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCisgIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKnRyYW5zX3N5c2RlcF90YWI7CisKKyAgLyogU2l6ZSBvZiBoYXNoIHRhYmxlLiAgKi8KICAgbmxzX3VpbnQzMiBoYXNoX3NpemU7Ci0gIG5sc191aW50MzIgKmhhc2hfdGFiOworICAvKiBQb2ludGVyIHRvIGhhc2ggdGFibGUuICAqLworICBjb25zdCBubHNfdWludDMyICpoYXNoX3RhYjsKKyAgLyogMSBpZiB0aGUgaGFzaCB0YWJsZSB1c2VzIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MgdGhhbiB0aGlzIG1hY2hpbmUuICAqLworICBpbnQgbXVzdF9zd2FwX2hhc2hfdGFiOworCisgIGludCBjb2Rlc2V0X2NudHI7CisjaWZkZWYgX0xJQkMKKyAgX19nY29udl90IGNvbnY7CisjZWxzZQorIyBpZiBIQVZFX0lDT05WCisgIGljb252X3QgY29udjsKKyMgZW5kaWYKKyNlbmRpZgorICBjaGFyICoqY29udl90YWI7CisKKyAgc3RydWN0IGV4cHJlc3Npb24gKnBsdXJhbDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgbnBsdXJhbHM7CiB9OwogCisvKiBXZSB3YW50IHRvIGFsbG9jYXRlIGEgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdC4gIEJ1dCBJU08gQworICAgZG9lc24ndCBhbGxvdyB6ZXJvIHNpemVkIGFycmF5cy4gICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIFpFUk8gMAorI2Vsc2UKKyMgZGVmaW5lIFpFUk8gMQorI2VuZGlmCisKKy8qIEEgc2V0IG9mIHNldHRpbmdzIGJvdW5kIHRvIGEgbWVzc2FnZSBkb21haW4uICBVc2VkIHRvIHN0b3JlIHNldHRpbmdzCisgICBmcm9tIGJpbmR0ZXh0ZG9tYWluKCkgYW5kIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkuICAqLwogc3RydWN0IGJpbmRpbmcKIHsKICAgc3RydWN0IGJpbmRpbmcgKm5leHQ7Ci0gIGNoYXIgKmRvbWFpbm5hbWU7CiAgIGNoYXIgKmRpcm5hbWU7CisgIGludCBjb2Rlc2V0X2NudHI7CS8qIEluY3JlbWVudGVkIGVhY2ggdGltZSBjb2Rlc2V0IGNoYW5nZXMuICAqLworICBjaGFyICpjb2Rlc2V0OworICBjaGFyIGRvbWFpbm5hbWVbWkVST107CiB9OwogCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfbmxfZmluZF9kb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kaXJuYW1lLAotCQkJCQkJIGNoYXIgKl9fbG9jYWxlLAotCQkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotdm9pZCBfbmxfbG9hZF9kb21haW4gUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW4pKTsKKy8qIEEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgc29tZSBwcmV2aW91cyB0cmFuc2xhdGlvbnMKKyAgIGJlY29tZSBpbnZhbGlkLgorICAgVGhpcyB2YXJpYWJsZSBpcyBwYXJ0IG9mIHRoZSBleHRlcm5hbCBBQkkgb2YgdGhlIEdOVSBsaWJpbnRsLiAgKi8KK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKworI2lmbmRlZiBfTElCQworY29uc3QgY2hhciAqX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSk7CisjZW5kaWYKKworc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpfX2Rpcm5hbWUsIGNoYXIgKl9fbG9jYWxlLAorCQkJCQkgY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCQkgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Cit2b2lkIF9ubF9sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW4sCisJCSAgICAgIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOwordm9pZCBfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKK2NvbnN0IGNoYXIgKl9ubF9pbml0X2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbl9maWxlLAorCQkJCSAgc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluLAorCQkJCSAgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Cit2b2lkIF9ubF9mcmVlX2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqX19kb21haW4pCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworCitjaGFyICpfbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorCQkgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcsIGNvbnN0IGNoYXIgKm1zZ2lkLAorCQkgICAgc2l6ZV90ICpsZW5ndGhwKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworI2lmZGVmIF9MSUJDCitleHRlcm4gY2hhciAqX19nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKTsKK2V4dGVybiBjaGFyICpfX2RnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpOworZXh0ZXJuIGNoYXIgKl9fZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQkgIGludCBfX2NhdGVnb3J5KTsKK2V4dGVybiBjaGFyICpfX25nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uKTsKK2V4dGVybiBjaGFyICpfX2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgIHVuc2lnbmVkIGxvbmcgaW50IG4pOworZXh0ZXJuIGNoYXIgKl9fZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSk7CitleHRlcm4gY2hhciAqX19kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgICBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKKwkJCSAgIGludCBfX2NhdGVnb3J5KTsKK2V4dGVybiBjaGFyICpfX3RleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSk7CitleHRlcm4gY2hhciAqX19iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7CitleHRlcm4gY2hhciAqX19iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCQljb25zdCBjaGFyICpfX2NvZGVzZXQpOworI2Vsc2UKKy8qIERlY2xhcmUgdGhlIGV4cG9ydGVkIGxpYmludGxfKiBmdW5jdGlvbnMsIGluIGEgd2F5IHRoYXQgYWxsb3dzIHVzIHRvCisgICBjYWxsIHRoZW0gdW5kZXIgdGhlaXIgcmVhbCBuYW1lLiAgKi8KKyMgdW5kZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisjIHVuZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RjaWdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJCSBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKKwkJCQkgaW50IF9fY2F0ZWdvcnkpOworI2VuZGlmCiAKIC8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwogCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9nbW8uaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2dtby5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNDMxNzM2NTM2IC0wNDAwCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBEZXNjcmlwdGlvbiBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdDogZ2VuZXJhbCBmaWxlIGxheW91dC4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMjAwMC0yMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfR0VUVEVYVF9ICisjZGVmaW5lIF9HRVRURVhUX0ggMQorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQuICAqLworI2RlZmluZSBfTUFHSUMgMHg5NTA0MTJkZQorI2RlZmluZSBfTUFHSUNfU1dBUFBFRCAweGRlMTIwNDk1CisKKy8qIFJldmlzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudGx5IHVzZWQgLm1vIChiaW5hcnkpIGZpbGUgZm9ybWF0LiAgKi8KKyNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSIDAKKyNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSX1dJVEhfU1lTREVQX0kgMQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnRvcnRpb25zIGFyZSBhbiBhdHRlbXB0IHRvIHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IKKyAgIHRvIGRldGVybWluZSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgMzIgYml0cyB3aWRlLiAgQW4KKyAgIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIHVzZSBhdXRvY29uZidzIEFDX0NIRUNLX1NJWkVPRiBtYWNybywgYnV0CisgICBhcyBvZiB2ZXJzaW9uIGF1dG9jb25mLTIuMTMsIHRoZSBBQ19DSEVDS19TSVpFT0YgbWFjcm8gZG9lc24ndCB3b3JrCisgICB3aGVuIGNyb3NzLWNvbXBpbGluZy4gICovCisKKyNpZiBfX1NURENfXworIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyA0Mjk0OTY3Mjk1VQorI2Vsc2UKKyMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgMHhGRkZGRkZGRgorI2VuZGlmCisKKy8qIElmIFVJTlRfTUFYIGlzbid0IGRlZmluZWQsIGFzc3VtZSBpdCdzIGEgMzItYml0IHR5cGUuCisgICBUaGlzIHNob3VsZCBiZSB2YWxpZCBmb3IgYWxsIHN5c3RlbXMgR05VIGNhcmVzIGFib3V0IGJlY2F1c2UKKyAgIHRoYXQgZG9lc24ndCBpbmNsdWRlIDE2LWJpdCBzeXN0ZW1zLCBhbmQgb25seSBtb2Rlcm4gc3lzdGVtcworICAgKHRoYXQgY2VydGFpbmx5IGhhdmUgPGxpbWl0cy5oPikgaGF2ZSA2NCstYml0IGludGVncmFsIHR5cGVzLiAgKi8KKworI2lmbmRlZiBVSU5UX01BWAorIyBkZWZpbmUgVUlOVF9NQVggVUlOVF9NQVhfMzJfQklUUworI2VuZGlmCisKKyNpZiBVSU5UX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCit0eXBlZGVmIHVuc2lnbmVkIG5sc191aW50MzI7CisjZWxzZQorIyBpZiBVU0hSVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBubHNfdWludDMyOworIyBlbHNlCisjICBpZiBVTE9OR19NQVggPT0gVUlOVF9NQVhfMzJfQklUUwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG5sc191aW50MzI7CisjICBlbHNlCisgIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBpbnRlbmRlZCB0byB0aHJvdyBhbiBlcnJvci4gIFVzaW5nICNlcnJvciBpcworICAgICBub3QgcG9ydGFibGUgZW5vdWdoLiAgKi8KKyAgIkNhbm5vdCBkZXRlcm1pbmUgdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZS4iCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogSGVhZGVyIGZvciBiaW5hcnkgLm1vIGZpbGUgZm9ybWF0LiAgKi8KK3N0cnVjdCBtb19maWxlX2hlYWRlcgoreworICAvKiBUaGUgbWFnaWMgbnVtYmVyLiAgKi8KKyAgbmxzX3VpbnQzMiBtYWdpYzsKKyAgLyogVGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGUgZmlsZSBmb3JtYXQuICAqLworICBubHNfdWludDMyIHJldmlzaW9uOworCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtYWpvciByZXZpc2lvbiAwIG9yIDEuICAqLworCisgIC8qIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBwYWlycy4gICovCisgIG5sc191aW50MzIgbnN0cmluZ3M7CisgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgb3JpZ190YWJfb2Zmc2V0OworICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgdHJhbnNfdGFiX29mZnNldDsKKyAgLyogU2l6ZSBvZiBoYXNoIHRhYmxlLiAgKi8KKyAgbmxzX3VpbnQzMiBoYXNoX3RhYl9zaXplOworICAvKiBPZmZzZXQgb2YgZmlyc3QgaGFzaCB0YWJsZSBlbnRyeS4gICovCisgIG5sc191aW50MzIgaGFzaF90YWJfb2Zmc2V0OworCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtaW5vciByZXZpc2lvbiA+PSAxLiAgKi8KKworICAvKiBUaGUgbnVtYmVyIG9mIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudHMuICAqLworICBubHNfdWludDMyIG5fc3lzZGVwX3NlZ21lbnRzOworICAvKiBPZmZzZXQgb2YgdGFibGUgZGVzY3JpYmluZyBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KKyAgbmxzX3VpbnQzMiBzeXNkZXBfc2VnbWVudHNfb2Zmc2V0OworICAvKiBUaGUgbnVtYmVyIG9mIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBwYWlycy4gICovCisgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiBvcmlnaW5hbCBzeXNkZXAgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgb3JpZ19zeXNkZXBfdGFiX29mZnNldDsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGVkIHN5c2RlcCBzdHJpbmdzLiAgKi8KKyAgbmxzX3VpbnQzMiB0cmFuc19zeXNkZXBfdGFiX29mZnNldDsKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIHN0YXRpYyBzdHJpbmcgY29udGFpbmVkIGluIHRoZSBiaW5hcnkgLm1vIGZpbGUuICAqLworc3RydWN0IHN0cmluZ19kZXNjCit7CisgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLworICBubHNfdWludDMyIGxlbmd0aDsKKyAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KKyAgbmxzX3VpbnQzMiBvZmZzZXQ7Cit9OworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWlub3IgcmV2aXNpb24gPj0gMS4gICovCisKKy8qIERlc2NyaXB0b3IgZm9yIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQuICAqLworc3RydWN0IHN5c2RlcF9zZWdtZW50Cit7CisgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisgIG5sc191aW50MzIgbGVuZ3RoOworICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLworICBubHNfdWludDMyIG9mZnNldDsKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nLiAgKi8KK3N0cnVjdCBzeXNkZXBfc3RyaW5nCit7CisgIC8qIE9mZnNldCBvZiBzdGF0aWMgc3RyaW5nIHNlZ21lbnRzIGluIGZpbGUuICAqLworICBubHNfdWludDMyIG9mZnNldDsKKyAgLyogQWx0ZXJuYXRpbmcgc2VxdWVuY2Ugb2Ygc3RhdGljIGFuZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLgorICAgICBUaGUgbGFzdCBzZWdtZW50IGlzIGEgc3RhdGljIHNlZ21lbnQsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KKyAgc3RydWN0IHNlZ21lbnRfcGFpcgorICB7CisgICAgLyogU2l6ZSBvZiBzdGF0aWMgc2VnbWVudC4gICovCisgICAgbmxzX3VpbnQzMiBzZWdzaXplOworICAgIC8qIFJlZmVyZW5jZSB0byBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LCBvciB+MCBhdCB0aGUgZW5kLiAgKi8KKyAgICBubHNfdWludDMyIHN5c2RlcHJlZjsKKyAgfSBzZWdtZW50c1sxXTsKK307CisKKy8qIE1hcmtlciBmb3IgdGhlIGVuZCBvZiB0aGUgc2VnbWVudHNbXSBhcnJheS4gIFRoaXMgaGFzIHRoZSB2YWx1ZSAweEZGRkZGRkZGLAorICAgcmVnYXJkbGVzcyB3aGV0aGVyICdpbnQnIGlzIDE2IGJpdCwgMzIgYml0LCBvciA2NCBiaXQuICAqLworI2RlZmluZSBTRUdNRU5UU19FTkQgKChubHNfdWludDMyKSB+MCkKKworLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisKKyNlbmRpZgkvKiBnZXR0ZXh0LmggICovCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9oYXNoLXN0cmluZy5oCTE5OTgtMDQtMjYgMDk6MjI6MzYuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvaGFzaC1zdHJpbmcuaAkyMDA0LTA5LTEyIDE0OjQwOjM0LjQzNjczNTc3NiAtMDQwMApAQCAtMSwzNSArMSwyMyBAQAotLyogSW1wbGVtZW50cyBhIHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLyogRGVzY3JpcHRpb24gb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQ6IHN0cmluZyBoYXNoaW5nIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogICAgYW55IGxhdGVyIHZlcnNpb24uCiAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfVkFMVUVTX0gKLSMgaW5jbHVkZSA8dmFsdWVzLmg+Ci0jZW5kaWYKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KIAogLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwogCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSBBcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoQXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCiAvKiBXZSBhc3N1bWUgdG8gaGF2ZSBgdW5zaWduZWQgbG9uZyBpbnQnIHZhbHVlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gICovCiAjZGVmaW5lIEhBU0hXT1JEQklUUyAzMgogCkBAIC0zNywxMSArMjUsOCBAQAogLyogRGVmaW5lcyB0aGUgc28gY2FsbGVkIGBoYXNocGp3JyBmdW5jdGlvbiBieSBQLkouIFdlaW5iZXJnZXIKICAgIFtzZWUgQWhvL1NldGhpL1VsbG1hbiwgQ09NUElMRVJTOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzIGFuZCBUb29scywKICAgIDE5ODYsIDE5ODcgQmVsbCBUZWxlcGhvbmUgTGFib3JhdG9yaWVzLCBJbmMuXSAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2hfc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fc3RyX3BhcmFtKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotaGFzaF9zdHJpbmcgKHN0cl9wYXJhbSkKLSAgICAgY29uc3QgY2hhciAqc3RyX3BhcmFtOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGludAoraGFzaF9zdHJpbmcgKGNvbnN0IGNoYXIgKnN0cl9wYXJhbSkKIHsKICAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKICAgY29uc3QgY2hhciAqc3RyID0gc3RyX3BhcmFtOwpAQCAtNTEsOCArMzYsOCBAQAogICB3aGlsZSAoKnN0ciAhPSAnXDAnKQogICAgIHsKICAgICAgIGh2YWwgPDw9IDQ7Ci0gICAgICBodmFsICs9ICh1bnNpZ25lZCBsb25nKSAqc3RyKys7Ci0gICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZykgMHhmIDw8IChIQVNIV09SREJJVFMgLSA0KSk7CisgICAgICBodmFsICs9ICh1bnNpZ25lZCBjaGFyKSAqc3RyKys7CisgICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZyBpbnQpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOwogICAgICAgaWYgKGcgIT0gMCkKIAl7CiAJICBodmFsIF49IGcgPj4gKEhBU0hXT1JEQklUUyAtIDgpOwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvaW50bC1jb21wYXQuYwkxOTk4LTA0LTI2IDA5OjIwOjUyLjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2ludGwtY29tcGF0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC40NDE3MzUwMTYgLTA0MDAKQEAgLTEsNzYgKzEsMTMxIEBACiAvKiBpbnRsLWNvbXBhdC5jIC0gU3R1YiBmdW5jdGlvbnMgdG8gY2FsbCBnZXR0ZXh0IGZ1bmN0aW9ucyBmcm9tIEdOVSBnZXR0ZXh0CiAgICBMaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMjAwMC0yMDAzIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KIAotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIAotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCiAKICNpZmRlZiBIQVZFX0NPTkZJR19ICiAjIGluY2x1ZGUgPGNvbmZpZy5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKIAogLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwogCisvKiBUaGlzIGZpbGUgcmVkaXJlY3RzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9ucyAod2l0aG91dCBwcmVmaXgpIHRvIHRob3NlCisgICBkZWZpbmVkIGluIHRoZSBpbmNsdWRlZCBHTlUgbGliaW50bCBsaWJyYXJ5ICh3aXRoICJsaWJpbnRsXyIgcHJlZml4KS4KKyAgIEl0IGlzIGNvbXBpbGVkIGludG8gbGliaW50bCBpbiBvcmRlciB0byBtYWtlIHRoZSBBTV9HTlVfR0VUVEVYVCB0ZXN0CisgICBvZiBnZXR0ZXh0IDw9IDAuMTEuMiB3b3JrIHdpdGggdGhlIGxpYmludGwgbGlicmFyeSA+PSAwLjExLjMgd2hpY2gKKyAgIGhhcyB0aGUgcmVkaXJlY3Rpb25zIHByaW1hcmlseSBpbiB0aGUgPGxpYmludGwuaD4gaW5jbHVkZSBmaWxlLgorICAgSXQgaXMgYWxzbyBjb21waWxlZCBpbnRvIGxpYmdudWludGwgc28gdGhhdCBsaWJnbnVpbnRsLnNvIGNhbiBiZSB1c2VkCisgICBhcyBMRF9QUkVMT0FEYWJsZSBsaWJyYXJ5IG9uIGdsaWJjIHN5c3RlbXMsIHRvIHByb3ZpZGUgdGhlIGV4dHJhCisgICBmZWF0dXJlcyB0aGF0IHRoZSBmdW5jdGlvbnMgaW4gdGhlIGxpYmMgZG9uJ3QgaGF2ZSAobmFtZWx5LCBsb2dnaW5nKS4gICovCisKIAogI3VuZGVmIGdldHRleHQKICN1bmRlZiBkZ2V0dGV4dAogI3VuZGVmIGRjZ2V0dGV4dAorI3VuZGVmIG5nZXR0ZXh0CisjdW5kZWYgZG5nZXR0ZXh0CisjdW5kZWYgZGNuZ2V0dGV4dAogI3VuZGVmIHRleHRkb21haW4KICN1bmRlZiBiaW5kdGV4dGRvbWFpbgorI3VuZGVmIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0CisKKworLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQorICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKKyAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKKyMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbHNlCisjIGRlZmluZSBETExfRVhQT1JURUQKKyNlbmRpZgogCiAKK0RMTF9FWFBPUlRFRAogY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKK2dldHRleHQgKGNvbnN0IGNoYXIgKm1zZ2lkKQogewotICByZXR1cm4gYmluZHRleHRkb21haW5fXyAoZG9tYWlubmFtZSwgZGlybmFtZSk7CisgIHJldHVybiBsaWJpbnRsX2dldHRleHQgKG1zZ2lkKTsKIH0KIAogCitETExfRVhQT1JURUQKIGNoYXIgKgotZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7CitkZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQpCiB7Ci0gIHJldHVybiBkY2dldHRleHRfXyAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KTsKKyAgcmV0dXJuIGxpYmludGxfZGdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkKTsKIH0KIAogCitETExfRVhQT1JURUQKIGNoYXIgKgotZGdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKK2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKIHsKLSAgcmV0dXJuIGRnZXR0ZXh0X18gKGRvbWFpbm5hbWUsIG1zZ2lkKTsKKyAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOwogfQogCiAKK0RMTF9FWFBPUlRFRAogY2hhciAqCi1nZXR0ZXh0IChtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7CituZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCiB7Ci0gIHJldHVybiBnZXR0ZXh0X18gKG1zZ2lkKTsKKyAgcmV0dXJuIGxpYmludGxfbmdldHRleHQgKG1zZ2lkMSwgbXNnaWQyLCBuKTsKIH0KIAogCitETExfRVhQT1JURUQKIGNoYXIgKgotdGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKK2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKIHsKLSAgcmV0dXJuIHRleHRkb21haW5fXyAoZG9tYWlubmFtZSk7CisgIHJldHVybiBsaWJpbnRsX2RuZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4pOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkY25nZXR0ZXh0IChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCSAgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKwkgICAgaW50IGNhdGVnb3J5KQoreworICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbiwgY2F0ZWdvcnkpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCit0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpkb21haW5uYW1lKQoreworICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChkb21haW5uYW1lKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmRpcm5hbWUpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChkb21haW5uYW1lLCBkaXJuYW1lKTsKK30KKworCitETExfRVhQT1JURUQKK2NoYXIgKgorYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKmNvZGVzZXQpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChkb21haW5uYW1lLCBjb2Rlc2V0KTsKIH0KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2wxMG5mbGlzdC5jCTE5OTgtMDQtMjYgMDk6MjI6MzcuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvbDEwbmZsaXN0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC40NTc3MzI1ODQgLTA0MDAKQEAgLTEsNTIgKzEsNDAgQEAKLS8qIEhhbmRsZSBsaXN0IG9mIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCiAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICAgIGFueSBsYXRlciB2ZXJzaW9uLgogCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3Igc3RwY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFCTEKKyNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogIyBpbmNsdWRlIDxjb25maWcuaD4KICNlbmRpZgogCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0jaWYgIUhBVkVfU1RSQ0hSICYmICFkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBzdHJjaHIKLSMgIGRlZmluZSBzdHJjaHIgaW5kZXgKLSMgZW5kaWYKLSNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfQVJHWl9ICiAjIGluY2x1ZGUgPGFyZ3ouaD4KICNlbmRpZgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlICJsb2FkaW5mby5oIgogCkBAIC02NSwyMyArNTMsMzkgQEAKIC8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAogICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAogICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQorIyBpZm5kZWYgc3RwY3B5CisjICBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQorIyBlbmRpZgogI2Vsc2UKICMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOworc3RhdGljIGNoYXIgKnN0cGNweSAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKTsKICMgZW5kaWYKICNlbmRpZgogCisvKiBQYXRobmFtZSBzdXBwb3J0LgorICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCisgKi8KKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKKyMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAorICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKKyAgICAgJiYgKFApWzFdID09ICc6JykKKyMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgKElTU0xBU0ggKChQKVswXSkgfHwgSEFTX0RFVklDRSAoUCkpCisjZWxzZQorICAvKiBVbml4ICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCisjZW5kaWYKKwogLyogRGVmaW5lIGZ1bmN0aW9uIHdoaWNoIGFyZSB1c3VhbGx5IG5vdCBhdmFpbGFibGUuICAqLwogCiAjaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfQ09VTlQKIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBzdHJpbmdzIGluIEFSR1ouICAqLwotc3RhdGljIHNpemVfdCBhcmd6X2NvdW50X18gUEFSQU1TICgoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikpOwotCiBzdGF0aWMgc2l6ZV90Ci1hcmd6X2NvdW50X18gKGFyZ3osIGxlbikKLSAgICAgY29uc3QgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGxlbjsKK2FyZ3pfY291bnRfXyAoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikKIHsKICAgc2l6ZV90IGNvdW50ID0gMDsKICAgd2hpbGUgKGxlbiA+IDApCkBAIC05NSwxOCArOTksMTcgQEAKIH0KICMgdW5kZWYgX19hcmd6X2NvdW50CiAjIGRlZmluZSBfX2FyZ3pfY291bnQoYXJneiwgbGVuKSBhcmd6X2NvdW50X18gKGFyZ3osIGxlbikKKyNlbHNlCisjIGlmZGVmIF9MSUJDCisjICBkZWZpbmUgX19hcmd6X2NvdW50KGFyZ3osIGxlbikgSU5UVVNFKF9fYXJnel9jb3VudCkgKGFyZ3osIGxlbikKKyMgZW5kaWYKICNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX0NPVU5UICovCiAKICNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9TVFJJTkdJRlkKIC8qIE1ha2UgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBBUkdaIHByaW50YWJsZSBieSBjb252ZXJ0aW5nIGFsbCB0aGUgJ1wwJ3MKICAgIGV4Y2VwdCB0aGUgbGFzdCBpbnRvIHRoZSBjaGFyYWN0ZXIgU0VQLiAgKi8KLXN0YXRpYyB2b2lkIGFyZ3pfc3RyaW5naWZ5X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGxlbiwgaW50IHNlcCkpOwotCiBzdGF0aWMgdm9pZAotYXJnel9zdHJpbmdpZnlfXyAoYXJneiwgbGVuLCBzZXApCi0gICAgIGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBsZW47Ci0gICAgIGludCBzZXA7Cithcmd6X3N0cmluZ2lmeV9fIChjaGFyICphcmd6LCBzaXplX3QgbGVuLCBpbnQgc2VwKQogewogICB3aGlsZSAobGVuID4gMCkKICAgICB7CkBAIC0xMTksMTcgKzEyMiwxNiBAQAogfQogIyB1bmRlZiBfX2FyZ3pfc3RyaW5naWZ5CiAjIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBhcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKKyNlbHNlCisjIGlmZGVmIF9MSUJDCisjICBkZWZpbmUgX19hcmd6X3N0cmluZ2lmeShhcmd6LCBsZW4sIHNlcCkgXAorICBJTlRVU0UoX19hcmd6X3N0cmluZ2lmeSkgKGFyZ3osIGxlbiwgc2VwKQorIyBlbmRpZgogI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCiAKICNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCi1zdGF0aWMgY2hhciAqYXJnel9uZXh0X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLAotCQkJCSAgY29uc3QgY2hhciAqZW50cnkpKTsKLQogc3RhdGljIGNoYXIgKgotYXJnel9uZXh0X18gKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkKLSAgICAgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGFyZ3pfbGVuOwotICAgICBjb25zdCBjaGFyICplbnRyeTsKK2FyZ3pfbmV4dF9fIChjaGFyICphcmd6LCBzaXplX3QgYXJnel9sZW4sIGNvbnN0IGNoYXIgKmVudHJ5KQogewogICBpZiAoZW50cnkpCiAgICAgewpAQCAtMTUwLDExICsxNTIsOCBAQAogCiAKIC8qIFJldHVybiBudW1iZXIgb2YgYml0cyBzZXQgaW4gWC4gICovCi1zdGF0aWMgaW50IHBvcCBQQVJBTVMgKChpbnQgeCkpOwotCiBzdGF0aWMgaW5saW5lIGludAotcG9wICh4KQotICAgICBpbnQgeDsKK3BvcCAoaW50IHgpCiB7CiAgIC8qIFdlIGFzc3VtZSB0aGF0IG5vIG1vcmUgdGhhbiAxNiBiaXRzIGFyZSB1c2VkLiAgKi8KICAgeCA9ICgoeCAmIH4weDU1NTUpID4+IDEpICsgKHggJiAweDU1NTUpOwpAQCAtMTY3LDMxICsxNjYsMjcgQEAKIAogDAogc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCi1fbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBtYXNrLCBsYW5ndWFnZSwKLQkJICAgIHRlcnJpdG9yeSwgY29kZXNldCwgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJICAgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgZG9fYWxsb2NhdGUpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0OwotICAgICBjb25zdCBjaGFyICpkaXJsaXN0OwotICAgICBzaXplX3QgZGlybGlzdF9sZW47Ci0gICAgIGludCBtYXNrOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgICAgY29uc3QgY2hhciAqdGVycml0b3J5OwotICAgICBjb25zdCBjaGFyICpjb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotICAgICBjb25zdCBjaGFyICpzcGVjaWFsOwotICAgICBjb25zdCBjaGFyICpzcG9uc29yOwotICAgICBjb25zdCBjaGFyICpyZXZpc2lvbjsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGludCBkb19hbGxvY2F0ZTsKK19ubF9tYWtlX2wxMG5mbGlzdCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3QsCisJCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sCisJCSAgICBpbnQgbWFzaywgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKKwkJICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQsIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKKwkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAorCQkgICAgY29uc3QgY2hhciAqc3BvbnNvciwgY29uc3QgY2hhciAqcmV2aXNpb24sCisJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKQogewogICBjaGFyICphYnNfZmlsZW5hbWU7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmxhc3QgPSBOVUxMOworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbGFzdHA7CiAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKICAgY2hhciAqY3A7CisgIHNpemVfdCBkaXJsaXN0X2NvdW50OwogICBzaXplX3QgZW50cmllczsKICAgaW50IGNudDsKIAorICAvKiBJZiBMQU5HVUFHRSBjb250YWlucyBhbiBhYnNvbHV0ZSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbiwgd2UgaWdub3JlCisgICAgIERJUkxJU1QuICAqLworICBpZiAoSVNfQUJTT0xVVEVfUEFUSCAobGFuZ3VhZ2UpKQorICAgIGRpcmxpc3RfbGVuID0gMDsKKwogICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuICAqLwogICBhYnNfZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcmxpc3RfbGVuCiAJCQkJICArIHN0cmxlbiAobGFuZ3VhZ2UpCkBAIC0yMDksNyArMjA0LDcgQEAKIAkJCQkgICsgKCgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCiAJCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCiAJCQkJICAgICA/ICgxICsgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKLQkJCQkJICAgICA/IHN0cmxlbiAoc3BvbnNvcikgKyAxIDogMCkKKwkJCQkJICAgICA/IHN0cmxlbiAoc3BvbnNvcikgOiAwKQogCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAogCQkJCQkgICA/IHN0cmxlbiAocmV2aXNpb24pICsgMSA6IDApKSA6IDApCiAJCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwpAQCAtMjE3LDE0ICsyMTIsMTYgQEAKICAgaWYgKGFic19maWxlbmFtZSA9PSBOVUxMKQogICAgIHJldHVybiBOVUxMOwogCi0gIHJldHZhbCA9IE5VTEw7Ci0gIGxhc3QgPSBOVUxMOwotCiAgIC8qIENvbnN0cnVjdCBmaWxlIG5hbWUuICAqLwotICBtZW1jcHkgKGFic19maWxlbmFtZSwgZGlybGlzdCwgZGlybGlzdF9sZW4pOwotICBfX2FyZ3pfc3RyaW5naWZ5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3RfbGVuLCAnOicpOwotICBjcCA9IGFic19maWxlbmFtZSArIChkaXJsaXN0X2xlbiAtIDEpOwotICAqY3ArKyA9ICcvJzsKKyAgY3AgPSBhYnNfZmlsZW5hbWU7CisgIGlmIChkaXJsaXN0X2xlbiA+IDApCisgICAgeworICAgICAgbWVtY3B5IChjcCwgZGlybGlzdCwgZGlybGlzdF9sZW4pOworICAgICAgX19hcmd6X3N0cmluZ2lmeSAoY3AsIGRpcmxpc3RfbGVuLCBQQVRIX1NFUEFSQVRPUik7CisgICAgICBjcCArPSBkaXJsaXN0X2xlbjsKKyAgICAgIGNwWy0xXSA9ICcvJzsKKyAgICB9CisKICAgY3AgPSBzdHBjcHkgKGNwLCBsYW5ndWFnZSk7CiAKICAgaWYgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwKQpAQCAtMjcxLDcgKzI2OCw3IEBACiAKICAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5CiAgICAgIGF2YWlsYWJsZS4gICovCi0gIGxhc3QgPSBOVUxMOworICBsYXN0cCA9IGwxMG5maWxlX2xpc3Q7CiAgIGZvciAocmV0dmFsID0gKmwxMG5maWxlX2xpc3Q7IHJldHZhbCAhPSBOVUxMOyByZXR2YWwgPSByZXR2YWwtPm5leHQpCiAgICAgaWYgKHJldHZhbC0+ZmlsZW5hbWUgIT0gTlVMTCkKICAgICAgIHsKQEAgLTI4Niw3ICsyODMsNyBAQAogCSAgICBicmVhazsKIAkgIH0KIAotCWxhc3QgPSByZXR2YWw7CisJbGFzdHAgPSAmcmV0dmFsLT5uZXh0OwogICAgICAgfQogCiAgIGlmIChyZXR2YWwgIT0gTlVMTCB8fCBkb19hbGxvY2F0ZSA9PSAwKQpAQCAtMjk1LDQ4ICsyOTIsNjYgQEAKICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgfQogCi0gIHJldHZhbCA9IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCi0gICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpICsgKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pCi0JCQkJKiAoMSA8PCBwb3AgKG1hc2spKQotCQkJCSogc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopKSk7CisgIGRpcmxpc3RfY291bnQgPSAoZGlybGlzdF9sZW4gPiAwID8gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgOiAxKTsKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBsb2FkZWRfbDEwbmZpbGUuICAqLworICByZXR2YWwgPQorICAgIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCisgICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpCisJICAgICsgKCgoZGlybGlzdF9jb3VudCA8PCBwb3AgKG1hc2spKSArIChkaXJsaXN0X2NvdW50ID4gMSA/IDEgOiAwKSkKKwkgICAgICAgKiBzaXplb2YgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikpKTsKICAgaWYgKHJldHZhbCA9PSBOVUxMKQogICAgIHJldHVybiBOVUxMOwogCiAgIHJldHZhbC0+ZmlsZW5hbWUgPSBhYnNfZmlsZW5hbWU7Ci0gIHJldHZhbC0+ZGVjaWRlZCA9IChfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSAhPSAxCisKKyAgLyogV2Ugc2V0IHJldHZhbC0+ZGF0YSB0byBOVUxMIGhlcmU7IGl0IGlzIGZpbGxlZCBpbiBsYXRlci4KKyAgICAgU2V0dGluZyByZXR2YWwtPmRlY2lkZWQgdG8gMSBoZXJlIG1lYW5zIHRoYXQgcmV0dmFsIGRvZXMgbm90CisgICAgIGNvcnJlc3BvbmQgdG8gYSByZWFsIGZpbGUgKGRpcmxpc3RfY291bnQgPiAxKSBvciBpcyBub3Qgd29ydGgKKyAgICAgbG9va2luZyB1cCAoaWYgYW4gdW5ub3JtYWxpemVkIGNvZGVzZXQgd2FzIHNwZWNpZmllZCkuICAqLworICByZXR2YWwtPmRlY2lkZWQgPSAoZGlybGlzdF9jb3VudCA+IDEKIAkJICAgICB8fCAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAogCQkJICYmIChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkpOwogICByZXR2YWwtPmRhdGEgPSBOVUxMOwogCi0gIGlmIChsYXN0ID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dmFsLT5uZXh0ID0gKmwxMG5maWxlX2xpc3Q7Ci0gICAgICAqbDEwbmZpbGVfbGlzdCA9IHJldHZhbDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR2YWwtPm5leHQgPSBsYXN0LT5uZXh0OwotICAgICAgbGFzdC0+bmV4dCA9IHJldHZhbDsKLSAgICB9CisgIHJldHZhbC0+bmV4dCA9ICpsYXN0cDsKKyAgKmxhc3RwID0gcmV0dmFsOwogCiAgIGVudHJpZXMgPSAwOwotICAvKiBJZiB0aGUgRElSTElTVCBpcyBhIHJlYWwgbGlzdCB0aGUgUkVUVkFMIGVudHJ5IGNvcnJlc3BvbmRzIG5vdCB0bwotICAgICBhIHJlYWwgZmlsZS4gIFNvIHdlIGhhdmUgdG8gdXNlIHRoZSBESVJMSVNUIHNlcGFyYXRpb24gbWVjaGFuaXNtCi0gICAgIG9mIHRoZSBpbm5lciBsb29wLiAgKi8KLSAgY250ID0gX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgPT0gMSA/IG1hc2sgLSAxIDogbWFzazsKLSAgZm9yICg7IGNudCA+PSAwOyAtLWNudCkKKyAgLyogUmVjdXJzZSB0byBmaWxsIHRoZSBpbmhlcml0YW5jZSBsaXN0IG9mIFJFVFZBTC4KKyAgICAgSWYgdGhlIERJUkxJU1QgaXMgYSByZWFsIGxpc3QgKGkuZS4gRElSTElTVF9DT1VOVCA+IDEpLCB0aGUgUkVUVkFMCisgICAgIGVudHJ5IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSByZWFsIGZpbGU7IHJldHZhbC0+ZmlsZW5hbWUgY29udGFpbnMKKyAgICAgY29sb25zLiAgSW4gdGhpcyBjYXNlIHdlIGxvb3AgYWNyb3NzIGFsbCBlbGVtZW50cyBvZiBESVJMSVNUIGFuZAorICAgICBhY3Jvc3MgYWxsIGJpdCBwYXR0ZXJucyBkb21pbmF0ZWQgYnkgTUFTSy4KKyAgICAgSWYgdGhlIERJUkxJU1QgaXMgYSBzaW5nbGUgZGlyZWN0b3J5IG9yIGVudGlyZWx5IHJlZHVuZGFudCAoaS5lLgorICAgICBESVJMSVNUX0NPVU5UID09IDEpLCB3ZSBsb29wIGFjcm9zcyBhbGwgYml0IHBhdHRlcm5zIGRvbWluYXRlZCBieQorICAgICBNQVNLLCBleGNsdWRpbmcgTUFTSyBpdHNlbGYuCisgICAgIEluIGVpdGhlciBjYXNlLCB3ZSBsb29wIGRvd24gZnJvbSBNQVNLIHRvIDAuICBUaGlzIGhhcyB0aGUgZWZmZWN0CisgICAgIHRoYXQgdGhlIGV4dHJhIGJpdHMgaW4gdGhlIGxvY2FsZSBuYW1lIGFyZSBkcm9wcGVkIGluIHRoaXMgb3JkZXI6CisgICAgIGZpcnN0IHRoZSBtb2RpZmllciwgdGhlbiB0aGUgdGVycml0b3J5LCB0aGVuIHRoZSBjb2Rlc2V0LCB0aGVuIHRoZQorICAgICBub3JtYWxpemVkX2NvZGVzZXQuICAqLworICBmb3IgKGNudCA9IGRpcmxpc3RfY291bnQgPiAxID8gbWFzayA6IG1hc2sgLSAxOyBjbnQgPj0gMDsgLS1jbnQpCiAgICAgaWYgKChjbnQgJiB+bWFzaykgPT0gMAogCSYmICgoY250ICYgQ0VOX1NQRUNJRklDKSA9PSAwIHx8IChjbnQgJiBYUEdfU1BFQ0lGSUMpID09IDApCiAJJiYgKChjbnQgJiBYUEdfQ09ERVNFVCkgPT0gMCB8fCAoY250ICYgWFBHX05PUk1fQ09ERVNFVCkgPT0gMCkpCiAgICAgICB7Ci0JLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCi0JY2hhciAqZGlyID0gTlVMTDsKKwlpZiAoZGlybGlzdF9jb3VudCA+IDEpCisJICB7CisJICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgdGhlIERJUkxJU1QuICAqLworCSAgICBjaGFyICpkaXIgPSBOVUxMOwogCi0Jd2hpbGUgKChkaXIgPSBfX2FyZ3pfbmV4dCAoKGNoYXIgKikgZGlybGlzdCwgZGlybGlzdF9sZW4sIGRpcikpCi0JICAgICAgICE9IE5VTEwpCisJICAgIHdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQorCQkgICAhPSBOVUxMKQorCSAgICAgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KKwkJPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpciwgc3RybGVuIChkaXIpICsgMSwKKwkJCQkgICAgICBjbnQsIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCisJCQkJICAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKKwkJCQkgICAgICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIDEpOworCSAgfQorCWVsc2UKIAkgIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXMrK10KLQkgICAgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpciwgc3RybGVuIChkaXIpICsgMSwgY250LAotCQkJCSAgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKKwkgICAgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKGwxMG5maWxlX2xpc3QsIGRpcmxpc3QsIGRpcmxpc3RfbGVuLAorCQkJCSAgY250LCBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAogCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKIAkJCQkgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7CiAgICAgICB9CkBAIC0zNDcsMTEgKzM2MiwxMCBAQAogDAogLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAogICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KLSAgIG5hbWVzLiAgKi8KKyAgIG5hbWVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZQorICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCiBjb25zdCBjaGFyICoKLV9ubF9ub3JtYWxpemVfY29kZXNldCAoY29kZXNldCwgbmFtZV9sZW4pCi0gICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gICAgIHNpemVfdCBuYW1lX2xlbjsKK19ubF9ub3JtYWxpemVfY29kZXNldCAoY29uc3QgY2hhciAqY29kZXNldCwgc2l6ZV90IG5hbWVfbGVuKQogewogICBpbnQgbGVuID0gMDsKICAgaW50IG9ubHlfZGlnaXQgPSAxOwpAQCAtMzYwLDExICszNzQsMTEgQEAKICAgc2l6ZV90IGNudDsKIAogICBmb3IgKGNudCA9IDA7IGNudCA8IG5hbWVfbGVuOyArK2NudCkKLSAgICBpZiAoaXNhbG51bSAoY29kZXNldFtjbnRdKSkKKyAgICBpZiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCiAgICAgICB7CiAJKytsZW47CiAKLQlpZiAoaXNhbHBoYSAoY29kZXNldFtjbnRdKSkKKwlpZiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCiAJICBvbmx5X2RpZ2l0ID0gMDsKICAgICAgIH0KIApAQCAtMzc4LDkgKzM5Miw5IEBACiAJd3AgPSByZXR2YWw7CiAKICAgICAgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotCWlmIChpc2FscGhhIChjb2Rlc2V0W2NudF0pKQotCSAgKndwKysgPSB0b2xvd2VyIChjb2Rlc2V0W2NudF0pOwotCWVsc2UgaWYgKGlzZGlnaXQgKGNvZGVzZXRbY250XSkpCisJaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorCSAgKndwKysgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKTsKKwllbHNlIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKIAkgICp3cCsrID0gY29kZXNldFtjbnRdOwogCiAgICAgICAqd3AgPSAnXDAnOwpAQCAtMzk4LDkgKzQxMiw3IEBACiAgICB0byBiZSBkZWZpbmVkLiAgKi8KICNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCiBzdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOworc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCiB7CiAgIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKICAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9saWJnZXR0ZXh0LmgJMTk5OC0wNC0yNiAwOToyMjozNi4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9saWJnZXR0ZXh0LmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKQEAgLTEsMTgyICswLDAgQEAKLS8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBCZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzKSB3ZSBzb21ldGltZXMgaGF2ZSB0byBpbmNsdWRlCi0gICB0aGUgc3lzdGVtcyBsaWJpbnRsLmggYXMgd2VsbCBhcyB0aGlzIGZpbGUgd2UgaGF2ZSBtb3JlIGNvbXBsZXgKLSAgIGluY2x1ZGUgcHJvdGVjdGlvbiBhYm92ZS4gIEJ1dCB0aGUgc3lzdGVtcyBoZWFkZXIgbWlnaHQgcGVyaGFwcyBhbHNvCi0gICBkZWZpbmUgX0xJQklOVExfSCBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgdG8gcHJvdGVjdCB0aGUgZGVmaW5pdGlvbiBoZXJlLiAgKi8KLQotI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKSB8fCAhZGVmaW5lZCAoX0xJQkdFVFRFWFRfSCkKLSNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCkKLSMgZGVmaW5lIF9MSUJJTlRMX0gJMQotI2VuZGlmCi0jZGVmaW5lIF9MSUJHRVRURVhUX0gJMQotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jIGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19HTlVDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAoMCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgIUhBVkVfTENfTUVTU0FHRVMKLS8qIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBnZXR0ZXh0KCkgYW5kIGRnZXR0ZXh0KCkKLSAgIGZ1bmN0aW9uLiAgQnV0IHNvbWUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhpcyBkZWZpbmVkLiAgRGVmaW5lIGl0Ci0gICB0byBhIGRlZmF1bHQgdmFsdWUuICAqLwotIyBkZWZpbmUgTENfTUVTU0FHRVMgKC0xKQotI2VuZGlmCi0KLQotLyogRGVjbGFyYXRpb25zIGZvciBnZXR0ZXh0LXVzaW5nLWNhdGdldHMgaW50ZXJmYWNlLiAgRGVyaXZlZCBmcm9tCi0gICBKaW0gTWV5ZXJpbmcncyBsaWJpbnRsLmguICAqLwotc3RydWN0IF9tc2dfZW50Ci17Ci0gIGNvbnN0IGNoYXIgKl9tc2c7Ci0gIGludCBfbXNnX251bWJlcjsKLX07Ci0KLQotI2lmIEhBVkVfQ0FUR0VUUwotLyogVGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseSBieSBwby10by10Ymwuc2VkCi0gICBnZW5lcmF0ZWQgZmlsZSBgY2F0LWlkLXRibC5jJy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IF9tc2dfZW50IF9tc2dfdGJsW107Ci1leHRlcm4gaW50IF9tc2dfdGJsX2xlbmd0aDsKLSNlbmRpZgotCi0KLS8qIEZvciBhdXRvbWF0aWNhbCBleHRyYWN0aW9uIG9mIG1lc3NhZ2VzIHNvbWV0aW1lcyBubyByZWFsCi0gICB0cmFuc2xhdGlvbiBpcyBuZWVkZWQuICBJbnN0ZWFkIHRoZSBzdHJpbmcgaXRzZWxmIGlzIHRoZSByZXN1bHQuICAqLwotI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyKSAoU3RyKQotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqZGdldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkJaW50IF9fY2F0ZWdvcnkpKTsKLWV4dGVybiBjaGFyICpkY2dldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci1leHRlcm4gY2hhciAqdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLSNpZiBFTkFCTEVfTkxTCi0KLS8qIFNvbGFyaXMgMi4zIGhhcyB0aGUgZ2V0dGV4dCBmdW5jdGlvbiBidXQgZGNnZXR0ZXh0IGlzIG1pc3NpbmcuCi0gICBTbyB3ZSBvbWl0IHRoaXMgb3B0aW1pemF0aW9uIGZvciBTb2xhcmlzIDIuMy4gIEJUVywgU29sYXJpcyAyLjQKLSAgIGhhcyBkY2dldHRleHQuICAqLwotIyBpZiAhSEFWRV9DQVRHRVRTICYmICghSEFWRV9HRVRURVhUIHx8IEhBVkVfRENHRVRURVhUKQotCi0jICBkZWZpbmUgZ2V0dGV4dChNc2dpZCkJCQkJCQkgICAgICBcCi0gICAgIGRnZXR0ZXh0IChOVUxMLCBNc2dpZCkKLQotIyAgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKQkJCQkJICAgICAgXAotICAgICBkY2dldHRleHQgKERvbWFpbm5hbWUsIE1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gbG9hZG1zZ2NhdC5jLiAgV2UgbmVlZCBhIHNpZ24sCi0gICB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwKLSAgIHRyYW5zbGF0aW9ucy4gICovCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0KLSMgICBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKE1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgX19yZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgX19yZXN1bHQgPSBkY2dldHRleHRfXyAoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KTsJCSAgICAgIFwKLSAgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jICBlbmRpZgotIyBlbmRpZgotCi0jZWxzZQotCi0jIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoTXNnaWQpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKE1zZ2lkKQotIyBkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLQotI2VuZGlmCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xpYmdudWludGwuaC5pbgkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2xpYmdudWludGwuaC5pbgkyMDA0LTA5LTEyIDE0OjQwOjM0LjQ2MjczMTgyNCAtMDQwMApAQCAtMCwwICsxLDM4MyBAQAorLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfTElCSU5UTF9ICisjZGVmaW5lIF9MSUJJTlRMX0gJMQorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKy8qIFRoZSBMQ19NRVNTQUdFUyBsb2NhbGUgY2F0ZWdvcnkgaXMgdGhlIGNhdGVnb3J5IHVzZWQgYnkgdGhlIGZ1bmN0aW9ucworICAgZ2V0dGV4dCgpIGFuZCBkZ2V0dGV4dCgpLiAgSXQgaXMgc3BlY2lmaWVkIGluIFBPU0lYLCBidXQgbm90IGluIEFOU0kgQy4KKyAgIE9uIHN5c3RlbXMgdGhhdCBkb24ndCBkZWZpbmUgaXQsIHVzZSBhbiBhcmJpdHJhcnkgdmFsdWUgaW5zdGVhZC4KKyAgIE9uIFNvbGFyaXMsIDxsb2NhbGUuaD4gZGVmaW5lcyBfX0xPQ0FMRV9IIChvciBfTE9DQUxFX0ggaW4gU29sYXJpcyAyLjUpCisgICB0aGVuIGluY2x1ZGVzIDxsaWJpbnRsLmg+IChpLmUuIHRoaXMgZmlsZSEpIGFuZCB0aGVuIG9ubHkgZGVmaW5lcworICAgTENfTUVTU0FHRVMuICBUbyBhdm9pZCBhIHJlZGVmaW5pdGlvbiB3YXJuaW5nLCBkb24ndCBkZWZpbmUgTENfTUVTU0FHRVMKKyAgIGluIHRoaXMgY2FzZS4gICovCisjaWYgIWRlZmluZWQgTENfTUVTU0FHRVMgJiYgIShkZWZpbmVkIF9fTE9DQUxFX0ggfHwgKGRlZmluZWQgX0xPQ0FMRV9IICYmIGRlZmluZWQgX19zdW4pKQorIyBkZWZpbmUgTENfTUVTU0FHRVMgMTcyOQorI2VuZGlmCisKKy8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQorICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCisjZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKKworLyogUHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIGZpbGUgZm9ybWF0cy4gIFJldHVybnMgdGhlCisgICBtYXhpbXVtIG1pbm9yIHJldmlzaW9uIG51bWJlciBzdXBwb3J0ZWQgZm9yIGEgZ2l2ZW4gbWFqb3IgcmV2aXNpb24uICAqLworI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgXAorICAoKG1ham9yKSA9PSAwID8gMSA6IC0xKQorCisvKiBSZXNvbHZlIGEgcGxhdGZvcm0gc3BlY2lmaWMgY29uZmxpY3Qgb24gREpHUFAuICBHTlUgZ2V0dGV4dCB0YWtlcworICAgcHJlY2VkZW5jZSBvdmVyIF9jb25pb19nZXR0ZXh0LiAgKi8KKyNpZmRlZiBfX0RKR1BQX18KKyMgdW5kZWYgZ2V0dGV4dAorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBXZSByZWRpcmVjdCB0aGUgZnVuY3Rpb25zIHRvIHRob3NlIHByZWZpeGVkIHdpdGggImxpYmludGxfIi4gIFRoaXMgaXMKKyAgIG5lY2Vzc2FyeSwgYmVjYXVzZSBzb21lIHN5c3RlbXMgZGVmaW5lIGdldHRleHQvdGV4dGRvbWFpbi8uLi4gaW4gdGhlIEMKKyAgIGxpYnJhcnkgKG5hbWVseSwgU29sYXJpcyAyLjQgYW5kIG5ld2VyLCBhbmQgR05VIGxpYmMgMi4wIGFuZCBuZXdlcikuCisgICBJZiB3ZSB1c2VkIHRoZSB1bnByZWZpeGVkIG5hbWVzLCB0aGVyZSB3b3VsZCBiZSBjYXNlcyB3aGVyZSB0aGUKKyAgIGRlZmluaXRpb24gaW4gdGhlIEMgbGlicmFyeSB3b3VsZCBvdmVycmlkZSB0aGUgb25lIGluIHRoZSBsaWJpbnRsLnNvCisgICBzaGFyZWQgbGlicmFyeS4gIFJlY2FsbCB0aGF0IG9uIEVMRiBzeXN0ZW1zLCB0aGUgc3ltYm9scyBhcmUgbG9va2VkCisgICB1cCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgICAxLiBpbiB0aGUgZXhlY3V0YWJsZSwKKyAgICAgMi4gaW4gdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSwgaW4gb3JkZXIsCisgICAgIDMuIGluIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgc3BlY2lmaWVkIG9uIHRoZSBsaW5rCisgICAgICAgIGNvbW1hbmQgbGluZSwKKyAgICAgNC4gaW4gdGhlIGRsb3BlbigpZWQgc2hhcmVkIGxpYnJhcmllcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZQorICAgICAgICBkbG9wZW4oKWVkLgorICAgVGhlIGRlZmluaXRpb24gaW4gdGhlIEMgbGlicmFyeSB3b3VsZCBvdmVycmlkZSB0aGUgb25lIGluIGxpYmludGwuc28gaWYKKyAgIGVpdGhlcgorICAgICAqIC1sYyBpcyBnaXZlbiBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUgYW5kIC1saW50bCBpc24ndCwgb3IKKyAgICAgKiAtbGMgaXMgZ2l2ZW4gb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lIGJlZm9yZSAtbGludGwsIG9yCisgICAgICogbGliaW50bC5zbyBpcyBhIGRlcGVuZGVuY3kgb2YgYSBkbG9wZW4oKWVkIHNoYXJlZCBsaWJyYXJ5IGJ1dCBub3QKKyAgICAgICBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYXQgbGluayB0aW1lLgorICAgU2luY2UgU29sYXJpcyBnZXR0ZXh0KCkgYmVoYXZlcyBkaWZmZXJlbnRseSB0aGFuIEdOVSBnZXR0ZXh0KCksIHRoaXMKKyAgIHdvdWxkIGJlIHVuYWNjZXB0YWJsZS4KKworICAgVGhlIHJlZGlyZWN0aW9uIGhhcHBlbnMgYnkgZGVmYXVsdCB0aHJvdWdoIG1hY3JvcyBpbiBDLCBzbyB0aGF0ICZnZXR0ZXh0CisgICBpcyBpbmRlcGVuZGVudCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCwgYnV0IHRocm91Z2ggaW5saW5lIGZ1bmN0aW9ucyBpbgorICAgQysrLCBpbiBvcmRlciBub3QgdG8gaW50ZXJmZXJlIHdpdGggdGhlIG5hbWUgbWFuZ2xpbmcgb2YgY2xhc3MgZmllbGRzIG9yCisgICBjbGFzcyBtZXRob2RzIGNhbGxlZCAnZ2V0dGV4dCcuICAqLworCisvKiBUaGUgdXNlciBjYW4gZGVmaW5lIF9JTlRMX1JFRElSRUNUX0lOTElORSBvciBfSU5UTF9SRURJUkVDVF9NQUNST1MuCisgICBJZiBoZSBkb2Vzbid0LCB3ZSBjaG9vc2UgdGhlIG1ldGhvZC4gIEEgdGhpcmQgcG9zc2libGUgbWV0aG9kIGlzCisgICBfSU5UTF9SRURJUkVDVF9BU00sIHN1cHBvcnRlZCBvbmx5IGJ5IEdDQy4gICovCisjaWYgIShkZWZpbmVkIF9JTlRMX1JFRElSRUNUX0lOTElORSB8fCBkZWZpbmVkIF9JTlRMX1JFRElSRUNUX01BQ1JPUykKKyMgaWYgX19HTlVDX18gPj0gMiAmJiAhZGVmaW5lZCBfX0FQUExFX0NDX18gJiYgIWRlZmluZWQgX19NSU5HVzMyX18gJiYgIShfX0dOVUNfXyA9PSAyICYmIGRlZmluZWQgX0FJWCkgJiYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9BU00KKyMgZWxzZQorIyAgaWZkZWYgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisjICBlbHNlCisjICAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorLyogQXV4aWxpYXJ5IG1hY3Jvcy4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfQVNNCisjIGRlZmluZSBfSU5UTF9BU00oY25hbWUpIF9fYXNtX18gKF9JTlRMX0FTTU5BTUUgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgI2NuYW1lKSkKKyMgZGVmaW5lIF9JTlRMX0FTTU5BTUUocHJlZml4LGNuYW1lc3RyaW5nKSBfSU5UTF9TVFJJTkdJRlkgKHByZWZpeCkgY25hbWVzdHJpbmcKKyMgZGVmaW5lIF9JTlRMX1NUUklOR0lGWShwcmVmaXgpICNwcmVmaXgKKyNlbHNlCisjIGRlZmluZSBfSU5UTF9BU00oY25hbWUpCisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCkKK3sKKyAgcmV0dXJuIGxpYmludGxfZ2V0dGV4dCAoX19tc2dpZCk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgZ2V0dGV4dCBsaWJpbnRsX2dldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2dldHRleHQpOworI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpOworc3RhdGljIGlubGluZSBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQoreworICByZXR1cm4gbGliaW50bF9kZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBkZ2V0dGV4dCBsaWJpbnRsX2RnZXR0ZXh0CisjZW5kaWYKK2V4dGVybiBjaGFyICpkZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kZ2V0dGV4dCk7CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCisgICBsb2NhbGUuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQkJaW50IF9fY2F0ZWdvcnkpOworc3RhdGljIGlubGluZSBjaGFyICpkY2dldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKKwkJCSAgICAgICBpbnQgX19jYXRlZ29yeSkKK3sKKyAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQsIF9fY2F0ZWdvcnkpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGRjZ2V0dGV4dCBsaWJpbnRsX2RjZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQlpbnQgX19jYXRlZ29yeSkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGNnZXR0ZXh0KTsKKyNlbmRpZgorCisKKy8qIFNpbWlsYXIgdG8gYGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBudW1iZXIgTi4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9uZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbik7CitzdGF0aWMgaW5saW5lIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pCit7CisgIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChfX21zZ2lkMSwgX19tc2dpZDIsIF9fbik7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgbmdldHRleHQgbGliaW50bF9uZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfbmdldHRleHQpOworI2VuZGlmCisKKy8qIFNpbWlsYXIgdG8gYGRnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgbnVtYmVyIE4uICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAorCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24pOworc3RhdGljIGlubGluZSBjaGFyICpkbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZDEsCisJCQkgICAgICAgY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKK3sKKyAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBkbmdldHRleHQgbGliaW50bF9kbmdldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmRuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kbmdldHRleHQpOworI2VuZGlmCisKKy8qIFNpbWlsYXIgdG8gYGRjZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIG51bWJlciBOLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCQl1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQoreworICByZXR1cm4gbGliaW50bF9kY25nZXR0ZXh0IChfX2RvbWFpbm5hbWUsIF9fbXNnaWQxLCBfX21zZ2lkMiwgX19uLCBfX2NhdGVnb3J5KTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBkY25nZXR0ZXh0IGxpYmludGxfZGNuZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCSB1bnNpZ25lZCBsb25nIGludCBfX24sIGludCBfX2NhdGVnb3J5KQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9kY25nZXR0ZXh0KTsKKyNlbmRpZgorCisKKy8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgorICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KKyAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKQoreworICByZXR1cm4gbGliaW50bF90ZXh0ZG9tYWluIChfX2RvbWFpbm5hbWUpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIHRleHRkb21haW4gbGliaW50bF90ZXh0ZG9tYWluCisjZW5kaWYKK2V4dGVybiBjaGFyICp0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX3RleHRkb21haW4pOworI2VuZGlmCisKKy8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAorICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkKK3sKKyAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKF9fZG9tYWlubmFtZSwgX19kaXJuYW1lKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBiaW5kdGV4dGRvbWFpbiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCisjZW5kaWYKK2V4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX2Rpcm5hbWUpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluKTsKKyNlbmRpZgorCisvKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCisgICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJCSAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQoreworICByZXR1cm4gbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoX19kb21haW5uYW1lLCBfX2NvZGVzZXQpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgICAgY29uc3QgY2hhciAqX19jb2Rlc2V0KQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCk7CisjZW5kaWYKKworCisvKiBTdXBwb3J0IGZvciBmb3JtYXQgc3RyaW5ncyB3aXRoIHBvc2l0aW9ucyBpbiAqcHJpbnRmKCksIGZvbGxvd2luZyB0aGUKKyAgIFBPU0lYL1hTSSBzcGVjaWZpY2F0aW9uLgorICAgTm90ZTogVGhlc2UgcmVwbGFjZW1lbnRzIGZvciB0aGUgKnByaW50ZigpIGZ1bmN0aW9ucyBhcmUgdmlzaWJsZSBvbmx5CisgICBpbiBzb3VyY2UgZmlsZXMgdGhhdCAjaW5jbHVkZSA8bGliaW50bC5oPiBvciAjaW5jbHVkZSAiZ2V0dGV4dC5oIi4KKyAgIFBhY2thZ2VzIHRoYXQgdXNlICpwcmludGYoKSBpbiBzb3VyY2UgZmlsZXMgdGhhdCBkb24ndCByZWZlciB0byBfKCkKKyAgIG9yIGdldHRleHQoKSBidXQgZm9yIHdoaWNoIHRoZSBmb3JtYXQgc3RyaW5nIGNvdWxkIGJlIHRoZSByZXR1cm4gdmFsdWUKKyAgIG9mIF8oKSBvciBnZXR0ZXh0KCkgbmVlZCB0byBhZGQgdGhpcyAjaW5jbHVkZS4gIE9oIHdlbGwuICAqLworCisjaWYgIUBIQVZFX1BPU0lYX1BSSU5URkAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCB2YV9saXN0LiAgKi8KKyNpZiBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIKKyMgaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorIyBpbmNsdWRlIDx2YXJhcmdzLmg+CisjZW5kaWYKKworI3VuZGVmIGZwcmludGYKKyNkZWZpbmUgZnByaW50ZiBsaWJpbnRsX2ZwcmludGYKK2V4dGVybiBpbnQgZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7CisjdW5kZWYgdmZwcmludGYKKyNkZWZpbmUgdmZwcmludGYgbGliaW50bF92ZnByaW50ZgorZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCisjdW5kZWYgcHJpbnRmCisjZGVmaW5lIHByaW50ZiBsaWJpbnRsX3ByaW50ZgorZXh0ZXJuIGludCBwcmludGYgKGNvbnN0IGNoYXIgKiwgLi4uKTsKKyN1bmRlZiB2cHJpbnRmCisjZGVmaW5lIHZwcmludGYgbGliaW50bF92cHJpbnRmCitleHRlcm4gaW50IHZwcmludGYgKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyN1bmRlZiBzcHJpbnRmCisjZGVmaW5lIHNwcmludGYgbGliaW50bF9zcHJpbnRmCitleHRlcm4gaW50IHNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworI3VuZGVmIHZzcHJpbnRmCisjZGVmaW5lIHZzcHJpbnRmIGxpYmludGxfdnNwcmludGYKK2V4dGVybiBpbnQgdnNwcmludGYgKGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworI2lmIEBIQVZFX1NOUFJJTlRGQAorCisjdW5kZWYgc25wcmludGYKKyNkZWZpbmUgc25wcmludGYgbGliaW50bF9zbnByaW50ZgorZXh0ZXJuIGludCBzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyN1bmRlZiB2c25wcmludGYKKyNkZWZpbmUgdnNucHJpbnRmIGxpYmludGxfdnNucHJpbnRmCitleHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyNlbmRpZgorCisjaWYgQEhBVkVfQVNQUklOVEZACisKKyN1bmRlZiBhc3ByaW50ZgorI2RlZmluZSBhc3ByaW50ZiBsaWJpbnRsX2FzcHJpbnRmCitleHRlcm4gaW50IGFzcHJpbnRmIChjaGFyICoqLCBjb25zdCBjaGFyICosIC4uLik7CisjdW5kZWYgdmFzcHJpbnRmCisjZGVmaW5lIHZhc3ByaW50ZiBsaWJpbnRsX3Zhc3ByaW50ZgorZXh0ZXJuIGludCB2YXNwcmludGYgKGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyNlbmRpZgorCisjaWYgQEhBVkVfV1BSSU5URkAKKworI3VuZGVmIGZ3cHJpbnRmCisjZGVmaW5lIGZ3cHJpbnRmIGxpYmludGxfZndwcmludGYKK2V4dGVybiBpbnQgZndwcmludGYgKEZJTEUgKiwgY29uc3Qgd2NoYXJfdCAqLCAuLi4pOworI3VuZGVmIHZmd3ByaW50ZgorI2RlZmluZSB2ZndwcmludGYgbGliaW50bF92ZndwcmludGYKK2V4dGVybiBpbnQgdmZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7CisKKyN1bmRlZiB3cHJpbnRmCisjZGVmaW5lIHdwcmludGYgbGliaW50bF93cHJpbnRmCitleHRlcm4gaW50IHdwcmludGYgKGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKKyN1bmRlZiB2d3ByaW50ZgorI2RlZmluZSB2d3ByaW50ZiBsaWJpbnRsX3Z3cHJpbnRmCitleHRlcm4gaW50IHZ3cHJpbnRmIChjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOworCisjdW5kZWYgc3dwcmludGYKKyNkZWZpbmUgc3dwcmludGYgbGliaW50bF9zd3ByaW50ZgorZXh0ZXJuIGludCBzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKKyN1bmRlZiB2c3dwcmludGYKKyNkZWZpbmUgdnN3cHJpbnRmIGxpYmludGxfdnN3cHJpbnRmCitleHRlcm4gaW50IHZzd3ByaW50ZiAod2NoYXJfdCAqLCBzaXplX3QsIGNvbnN0IHdjaGFyX3QgKiwgdmFfbGlzdCk7CisKKyNlbmRpZgorCisjZW5kaWYKKworCisvKiBTdXBwb3J0IGZvciByZWxvY2F0YWJsZSBwYWNrYWdlcy4gICovCisKKy8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgorICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKyAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCisgICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCisgICBpbnN0ZWFkIG9mICIvIikuICAqLworI2RlZmluZSBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeAorZXh0ZXJuIHZvaWQKKyAgICAgICBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCisJCQkJICAgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXgpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBsaWJpbnRsLmggKi8KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xpbnV4LW1zZy5zZWQJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9saW51eC1tc2cuc2VkCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCkBAIC0xLDEwMCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIExpbnV4IHN0eWxlIC5tc2cgZmlsZQotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMKLSMgVGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgLm1zZyBzaG91bGQgYmUgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0jIG1lc3NhZ2Ugc2V0IG51bWJlci4gIFdlIHVzZSBhbHdheXMgc2V0IG51bWJlciAxLgotIwotMSB7Ci0gIGlcCi0kc2V0IDEgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgcG8ybXNnLnNlZAotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBNaXRjaCdzIG9sZCBjYXRhbG9nIGZvcm1hdCBkb2VzIG5vdCBhbGxvdyBjb21tZW50cy4KLSMKLSMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgotIwotL15tc2dpZC8gewotICBzL21zZ2lkWyAJXSoiLy8KLSMKLSMgVGhpcyBkb2VzIG5vdCB3b3JrIG5vdyB3aXRoIHRoZSBuZXcgZm9ybWF0LgotIyAvIiQvISB7Ci0jICAgcy9cXCQvLwotIyAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLwotIyB9Ci0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0gIEcKLSAgcy9cKC4qXCkiXG5cKFswLTldKlwpLyQgI1wyIE9yaWdpbmFsIE1lc3NhZ2U6KFwxKS9wCi19Ci0jCi0jIFRoZSAubXNnIGZpbGUgY29udGFpbnMsIG90aGVyIHRoZW4gdGhlIC5wbyBmaWxlLCBvbmx5IHRoZSB0cmFuc2xhdGlvbnMKLSMgYnV0IGVhY2ggZ2l2ZW4gYSB1bmlxdWUgSUQuICBTdGFydGluZyBmcm9tIDEgYW5kIGluY3JlbWVudGluZyBieSAxIGZvcgotIyBlYWNoIG1lc3NhZ2Ugd2UgYXNzaWduIHRoZW0gdG8gdGhlIG1lc3NhZ2VzLgotIyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgLnBvIGZpbGUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2F0LWlkLXRibC5jIGZpbGUKLSMgKHdpdGggcG8tdG8tdGJsKSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaGVyZS4gIChBdCBsZWFzdCB0aGUgb3JkZXIKLSMgb2YgZGVjbGFyYXRpb25zIG11c3Qgbm90IGJlIGNoYW5nZWQuKQotIwotL15tc2dzdHIvIHsKLSAgcy9tc2dzdHJbIAldKiJcKC4qXCkiLyMgXDEvCi0jIENsZWFyIHN1YnN0aXR1dGlvbiBmbGFnLgotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlxuXCkiXCguKlwpIi9cMVwyLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotICBQCi0gIEQKLSMgTm90ZSB0aGF0IEQgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0gIHRiCi19Ci1kCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2FkaW5mby5oCTE5OTgtMDQtMjYgMDk6MjA6NTIuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvbG9hZGluZm8uaAkyMDA0LTA5LTEyIDE0OjQwOjM0LjQ2ODczMDkxMiAtMDQwMApAQCAtMSw5ICsxLDU0IEBACi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKKy8qIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfTE9BRElORk9fSAorI2RlZmluZSBfTE9BRElORk9fSAkxCisKKy8qIERlY2xhcmF0aW9ucyBvZiBsb2NhbGUgZGVwZW5kZW50IGNhdGFsb2cgbG9va3VwIGZ1bmN0aW9ucy4KKyAgIEltcGxlbWVudGVkIGluCisKKyAgICAgbG9jYWxlYWxpYXMuYyAgICBQb3NzaWJseSByZXBsYWNlIGEgbG9jYWxlIG5hbWUgYnkgYW5vdGhlci4KKyAgICAgZXhwbG9kZW5hbWUuYyAgICBTcGxpdCBhIGxvY2FsZSBuYW1lIGludG8gaXRzIHZhcmlvdXMgZmllbGRzLgorICAgICBsMTBuZmxpc3QuYyAgICAgIEdlbmVyYXRlIGEgbGlzdCBvZiBmaWxlbmFtZXMgb2YgcG9zc2libGUgbWVzc2FnZSBjYXRhbG9ncy4KKyAgICAgZmluZGRvbWFpbi5jICAgICBGaW5kIGFuZCBvcGVuIHRoZSByZWxldmFudCBtZXNzYWdlIGNhdGFsb2dzLgorCisgICBUaGUgbWFpbiBmdW5jdGlvbiBfbmxfZmluZF9kb21haW4oKSBpbiBmaW5kZG9tYWluLmMgaXMgZGVjbGFyZWQKKyAgIGluIGdldHRleHRQLmguCisgKi8KKworI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgorIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24KKyNlbmRpZgorCisvKiBUZWxsIHRoZSBjb21waWxlciB3aGVuIGEgY29uZGl0aW9uYWwgb3IgaW50ZWdlciBleHByZXNzaW9uIGlzCisgICBhbG1vc3QgYWx3YXlzIHRydWUgb3IgYWxtb3N0IGFsd2F5cyBmYWxzZS4gICovCisjaWZuZGVmIEhBVkVfQlVJTFRJTl9FWFBFQ1QKKyMgZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoZXhwciwgdmFsKSAoZXhwcikKKyNlbmRpZgorCisvKiBTZXBhcmF0b3IgaW4gUEFUSCBsaWtlIGxpc3RzIG9mIHBhdGhuYW1lcy4gICovCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCisgIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc7JworI2Vsc2UKKyAgLyogVW5peCAqLworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzonCiAjZW5kaWYKIAogLyogRW5jb2Rpbmcgb2YgbG9jYWxlIG5hbWUgcGFydHMuICAqLwpAQCAtMzIsMjcgKzc3LDY5IEBACiB9OwogCiAKLWV4dGVybiBjb25zdCBjaGFyICpfbmxfbm9ybWFsaXplX2NvZGVzZXQgUEFSQU1TICgoY29uc3QgY2hhciAqY29kZXNldCwKLQkJCQkJCSAgc2l6ZV90IG5hbWVfbGVuKSk7CisvKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0CisgICBuYW1lcy4gIE5vcm1hbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbgorICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCisgICBmcmVlZCBieSB0aGUgY2FsbGVyLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpfbmxfbm9ybWFsaXplX2NvZGVzZXQgKGNvbnN0IGNoYXIgKmNvZGVzZXQsCisJCQkJCSAgc2l6ZV90IG5hbWVfbGVuKTsKIAorLyogTG9va3VwIGEgbG9jYWxlIGRlcGVuZGVudCBmaWxlLgorICAgKkwxME5GSUxFX0xJU1QgZGVub3RlcyBhIHBvb2wgb2YgbG9va3VwIHJlc3VsdHMgb2YgbG9jYWxlIGRlcGVuZGVudAorICAgZmlsZXMgb2YgdGhlIHNhbWUga2luZCwgc29ydGVkIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgLT5maWxlbmFtZS4KKyAgIERJUkxJU1QgYW5kIERJUkxJU1RfTEVOIGFyZSBhbiBhcmd6IGxpc3Qgb2YgZGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8KKyAgIGxvb2ssIGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGRpcmVjdG9yeSAoaS5lLiBESVJMSVNUX0xFTiA+IDApLgorICAgTUFTSywgTEFOR1VBR0UsIFRFUlJJVE9SWSwgQ09ERVNFVCwgTk9STUFMSVpFRF9DT0RFU0VULCBNT0RJRklFUiwKKyAgIFNQRUNJQUwsIFNQT05TT1IsIFJFVklTSU9OIGFyZSB0aGUgcGllY2VzIG9mIHRoZSBsb2NhbGUgbmFtZSwgYXMKKyAgIHByb2R1Y2VkIGJ5IF9ubF9leHBsb2RlX25hbWUoKS4gIEZJTEVOQU1FIGlzIHRoZSBmaWxlbmFtZSBzdWZmaXguCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsb29rdXAgcmVzdWx0LCBlaXRoZXIgZm91bmQgaW4gKkwxME5GSUxFX0xJU1QsCisgICBvciAtIGlmIERPX0FMTE9DQVRFIGlzIG5vbnplcm8gLSBmcmVzaGx5IGFsbG9jYXRlZCwgb3IgcG9zc2libHkgTlVMTC4KKyAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLU5VTEwsIGl0IGlzIGFkZGVkIHRvICpMMTBORklMRV9MSVNULCBhbmQKKyAgIGl0cyAtPm5leHQgZmllbGQgZGVub3RlcyB0aGUgY2hhaW5pbmcgaW5zaWRlICpMMTBORklMRV9MSVNULCBhbmQKKyAgIGZ1cnRoZXJtb3JlIGl0cyAtPnN1Y2Nlc3NvcltdIGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBvdGhlciBsb29rdXAKKyAgIHJlc3VsdHMgZnJvbSB3aGljaCB0aGlzIGxvb2t1cCByZXN1bHQgaW5oZXJpdHMuICAqLwogZXh0ZXJuIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAotCQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCi0JCQkgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKLQkJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJICAgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKLQkJCSAgICBjb25zdCBjaGFyICpzcG9uc29yLCBjb25zdCBjaGFyICpyZXZpc2lvbiwKLQkJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKSk7CitfbmxfbWFrZV9sMTBuZmxpc3QgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAorCQkgICAgY29uc3QgY2hhciAqZGlybGlzdCwgc2l6ZV90IGRpcmxpc3RfbGVuLCBpbnQgbWFzaywKKwkJICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCisJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LCBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCisJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKKwkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSk7CiAKKy8qIExvb2t1cCB0aGUgcmVhbCBsb2NhbGUgbmFtZSBmb3IgYSBsb2NhbGUgYWxpYXMgTkFNRSwgb3IgTlVMTCBpZgorICAgTkFNRSBpcyBub3QgYSBsb2NhbGUgYWxpYXMgKGJ1dCBwb3NzaWJseSBhIHJlYWwgbG9jYWxlIG5hbWUpLgorICAgVGhlIHJldHVybiB2YWx1ZSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhbmQgbXVzdCBub3QgYmUgZnJlZWQuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgKGNvbnN0IGNoYXIgKm5hbWUpOwogCi1leHRlcm4gY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7CisvKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBpdHMgcGllY2VzOiBsYW5ndWFnZSwgbW9kaWZpZXIsCisgICB0ZXJyaXRvcnksIGNvZGVzZXQsIHNwZWNpYWwsIHNwb25zb3IsIHJldmlzaW9uLgorICAgTkFNRSBnZXRzIGRlc3RydWN0aXZlbHkgbW9kaWZpZWQ6IE5VTCBieXRlcyBhcmUgaW5zZXJ0ZWQgaGVyZSBhbmQKKyAgIHRoZXJlLiAgKkxBTkdVQUdFIGdldHMgYXNzaWduZWQgTkFNRS4gIEVhY2ggb2YgKk1PRElGSUVSLCAqVEVSUklUT1JZLAorICAgKkNPREVTRVQsICpTUEVDSUFMLCAqU1BPTlNPUiwgKlJFVklTSU9OIGdldHMgYXNzaWduZWQgZWl0aGVyIGEKKyAgIHBvaW50ZXIgaW50byB0aGUgb2xkIE5BTUUgc3RyaW5nLCBvciBOVUxMLiAgKk5PUk1BTElaRURfQ09ERVNFVAorICAgZ2V0cyBhc3NpZ25lZCB0aGUgZXhwYW5kZWQgKkNPREVTRVQsIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tICpDT0RFU0VUOworICAgdGhpcyBvbmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBoYXMgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBiaXRtYXNrLCB3aGVyZSBlYWNoIGJpdCBjb3JyZXNwb25kcyB0byBvbmUKKyAgIGZpbGxlZC1pbiB2YWx1ZToKKyAgICAgWFBHX01PRElGSUVSLCBDRU5fQVVESUVOQ0UgIGZvciAqTU9ESUZJRVIsCisgICAgIFRFUlJJVE9SWSAgICAgICAgICAgICAgICAgICBmb3IgKlRFUlJJVE9SWSwKKyAgICAgWFBHX0NPREVTRVQgICAgICAgICAgICAgICAgIGZvciAqQ09ERVNFVCwKKyAgICAgWFBHX05PUk1fQ09ERVNFVCAgICAgICAgICAgIGZvciAqTk9STUFMSVpFRF9DT0RFU0VULAorICAgICBDRU5fU1BFQ0lBTCAgICAgICAgICAgICAgICAgZm9yICpTUEVDSUFMLAorICAgICBDRU5fU1BPTlNPUiAgICAgICAgICAgICAgICAgZm9yICpTUE9OU09SLAorICAgICBDRU5fUkVWSVNJT04gICAgICAgICAgICAgICAgZm9yICpSRVZJU0lPTi4KKyAqLworZXh0ZXJuIGludCBfbmxfZXhwbG9kZV9uYW1lIChjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsCisJCQkgICAgIGNvbnN0IGNoYXIgKiptb2RpZmllciwgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwKKwkJCSAgICAgY29uc3QgY2hhciAqKmNvZGVzZXQsCisJCQkgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsCisJCQkgICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsLCBjb25zdCBjaGFyICoqc3BvbnNvciwKKwkJCSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uKTsKIAotZXh0ZXJuIGludCBfbmxfZXhwbG9kZV9uYW1lIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiptb2RpZmllciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnksCi0JCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipub3JtYWxpemVkX2NvZGVzZXQsCi0JCQkJICAgICBjb25zdCBjaGFyICoqc3BlY2lhbCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipzcG9uc29yLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnJldmlzaW9uKSk7CisvKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBhIGxlYWRpbmcgbGFuZ3VhZ2UgcGFydCBhbmQgYWxsIHRoZQorICAgcmVzdC4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgbGFuZ3VhZ2UsCisgICBpLmUuIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXN0LiAgKi8KK2V4dGVybiBjaGFyICpfbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZgkvKiBsb2FkaW5mby5oICovCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2FkbXNnY2F0LmMJMTk5OC0wNC0yNiAwOToyMjozNy4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2FkbXNnY2F0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC40NzM3MzAxNTIgLTA0MDAKQEAgLTEsNDIgKzEsNDU1IEBACi0vKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvKiBMb2FkIG5lZWRlZCBtZXNzYWdlIGNhdGFsb2dzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogICAgYW55IGxhdGVyIHZlcnNpb24uCiAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKKyNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogIyBpbmNsdWRlIDxjb25maWcuaD4KICNlbmRpZgogCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX19HTlVDX18KKyMgdW5kZWYgIGFsbG9jYQorIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYQorY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgogI2VuZGlmCiAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCiAjIGluY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmCiAKLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCkgfHwgZGVmaW5lZCBfTElCQworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxhbmdpbmZvLmg+CisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCisgICAgfHwgKGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfUE9TSVhfTUFQUEVEX0ZJTEVTKQogIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgorIyB1bmRlZiBIQVZFX01NQVAKKyMgZGVmaW5lIEhBVkVfTU1BUAkxCisjZWxzZQorIyB1bmRlZiBIQVZFX01NQVAKICNlbmRpZgogCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgorI2lmIGRlZmluZWQgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQgSEFWRV9JTlRUWVBFU19IIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ21vLmgiCiAjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgorI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCisjZW5kaWYKKworLyogUHJvdmlkZSBmYWxsYmFjayB2YWx1ZXMgZm9yIG1hY3JvcyB0aGF0IG91Z2h0IHRvIGJlIGRlZmluZWQgaW4gPGludHR5cGVzLmg+LgorICAgTm90ZSB0aGF0IG91ciBmYWxsYmFjayB2YWx1ZXMgbmVlZCBub3QgYmUgbGl0ZXJhbCBzdHJpbmdzLCBiZWNhdXNlIHdlIGRvbid0CisgICB1c2UgdGhlbSB3aXRoIHByZXByb2Nlc3NvciBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gICovCisjaWYgIWRlZmluZWQgUFJJZDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZDgKKyMgZGVmaW5lIFBSSWQ4ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaTggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaTgKKyMgZGVmaW5lIFBSSWk4ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJbzggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJbzgKKyMgZGVmaW5lIFBSSW84ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdTgKKyMgZGVmaW5lIFBSSXU4ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeDgKKyMgZGVmaW5lIFBSSXg4ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWDgKKyMgZGVmaW5lIFBSSVg4ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWQxNgorIyBkZWZpbmUgUFJJZDE2ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaTE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWkxNgorIyBkZWZpbmUgUFJJaTE2ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJbzE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW8xNgorIyBkZWZpbmUgUFJJbzE2ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXUxNgorIyBkZWZpbmUgUFJJdTE2ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXgxNgorIyBkZWZpbmUgUFJJeDE2ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVgxNgorIyBkZWZpbmUgUFJJWDE2ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWQzMgorIyBkZWZpbmUgUFJJZDMyICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaTMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWkzMgorIyBkZWZpbmUgUFJJaTMyICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJbzMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW8zMgorIyBkZWZpbmUgUFJJbzMyICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXUzMgorIyBkZWZpbmUgUFJJdTMyICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXgzMgorIyBkZWZpbmUgUFJJeDMyICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVgzMgorIyBkZWZpbmUgUFJJWDMyICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWQ2NAorIyBkZWZpbmUgUFJJZDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibGQiIDogImxsZCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaTY0CisjIGRlZmluZSBQUklpNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsaSIgOiAibGxpIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW82NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvNjQKKyMgZGVmaW5lIFBSSW82NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxvIiA6ICJsbG8iKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdTY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXU2NAorIyBkZWZpbmUgUFJJdTY0IChzaXplb2YgKGxvbmcpID09IDggPyAibHUiIDogImxsdSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4NjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeDY0CisjIGRlZmluZSBQUkl4NjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJseCIgOiAibGx4IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYNjQKKyMgZGVmaW5lIFBSSVg2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxYIiA6ICJsbFgiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkTEVBU1Q4CisjIGRlZmluZSBQUklkTEVBU1Q4ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpTEVBU1Q4CisjIGRlZmluZSBQUklpTEVBU1Q4ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvTEVBU1Q4CisjIGRlZmluZSBQUklvTEVBU1Q4ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1TEVBU1Q4CisjIGRlZmluZSBQUkl1TEVBU1Q4ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4TEVBU1Q4CisjIGRlZmluZSBQUkl4TEVBU1Q4ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYTEVBU1Q4CisjIGRlZmluZSBQUklYTEVBU1Q4ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZExFQVNUMTYKKyMgZGVmaW5lIFBSSWRMRUFTVDE2ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUxFQVNUMTYKKyMgZGVmaW5lIFBSSWlMRUFTVDE2ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0xFQVNUMTYKKyMgZGVmaW5lIFBSSW9MRUFTVDE2ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUxFQVNUMTYKKyMgZGVmaW5lIFBSSXVMRUFTVDE2ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeExFQVNUMTYKKyMgZGVmaW5lIFBSSXhMRUFTVDE2ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWExFQVNUMTYKKyMgZGVmaW5lIFBSSVhMRUFTVDE2ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZExFQVNUMzIKKyMgZGVmaW5lIFBSSWRMRUFTVDMyICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUxFQVNUMzIKKyMgZGVmaW5lIFBSSWlMRUFTVDMyICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0xFQVNUMzIKKyMgZGVmaW5lIFBSSW9MRUFTVDMyICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUxFQVNUMzIKKyMgZGVmaW5lIFBSSXVMRUFTVDMyICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeExFQVNUMzIKKyMgZGVmaW5lIFBSSXhMRUFTVDMyICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWExFQVNUMzIKKyMgZGVmaW5lIFBSSVhMRUFTVDMyICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZExFQVNUNjQKKyMgZGVmaW5lIFBSSWRMRUFTVDY0IFBSSWQ2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUxFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUxFQVNUNjQKKyMgZGVmaW5lIFBSSWlMRUFTVDY0IFBSSWk2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0xFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0xFQVNUNjQKKyMgZGVmaW5lIFBSSW9MRUFTVDY0IFBSSW82NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUxFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUxFQVNUNjQKKyMgZGVmaW5lIFBSSXVMRUFTVDY0IFBSSXU2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeExFQVNUNjQKKyMgZGVmaW5lIFBSSXhMRUFTVDY0IFBSSXg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWExFQVNUNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWExFQVNUNjQKKyMgZGVmaW5lIFBSSVhMRUFTVDY0IFBSSVg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRGQVNUOAorIyBkZWZpbmUgUFJJZEZBU1Q4ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlGQVNUOAorIyBkZWZpbmUgUFJJaUZBU1Q4ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9GQVNUOAorIyBkZWZpbmUgUFJJb0ZBU1Q4ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVGQVNUOAorIyBkZWZpbmUgUFJJdUZBU1Q4ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhGQVNUOAorIyBkZWZpbmUgUFJJeEZBU1Q4ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhGQVNUOAorIyBkZWZpbmUgUFJJWEZBU1Q4ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkRkFTVDE2CisjIGRlZmluZSBQUklkRkFTVDE2ICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpRkFTVDE2CisjIGRlZmluZSBQUklpRkFTVDE2ICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvRkFTVDE2CisjIGRlZmluZSBQUklvRkFTVDE2ICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1RkFTVDE2CisjIGRlZmluZSBQUkl1RkFTVDE2ICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4RkFTVDE2CisjIGRlZmluZSBQUkl4RkFTVDE2ICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYRkFTVDE2CisjIGRlZmluZSBQUklYRkFTVDE2ICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkRkFTVDMyCisjIGRlZmluZSBQUklkRkFTVDMyICJkIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpRkFTVDMyCisjIGRlZmluZSBQUklpRkFTVDMyICJpIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvRkFTVDMyCisjIGRlZmluZSBQUklvRkFTVDMyICJvIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1RkFTVDMyCisjIGRlZmluZSBQUkl1RkFTVDMyICJ1IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4RkFTVDMyCisjIGRlZmluZSBQUkl4RkFTVDMyICJ4IgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYRkFTVDMyCisjIGRlZmluZSBQUklYRkFTVDMyICJYIgorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkRkFTVDY0CisjIGRlZmluZSBQUklkRkFTVDY0IFBSSWQ2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaUZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpRkFTVDY0CisjIGRlZmluZSBQUklpRkFTVDY0IFBSSWk2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJb0ZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvRkFTVDY0CisjIGRlZmluZSBQUklvRkFTVDY0IFBSSW82NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdUZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1RkFTVDY0CisjIGRlZmluZSBQUkl1RkFTVDY0IFBSSXU2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4RkFTVDY0CisjIGRlZmluZSBQUkl4RkFTVDY0IFBSSXg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWEZBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYRkFTVDY0CisjIGRlZmluZSBQUklYRkFTVDY0IFBSSVg2NAorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkTUFYCisjIGRlZmluZSBQUklkTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsZCIgOiAibGxkIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaU1BWAorIyBkZWZpbmUgUFJJaU1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibGkiIDogImxsaSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9NQVgKKyMgZGVmaW5lIFBSSW9NQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxvIiA6ICJsbG8iKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1TUFYCisjIGRlZmluZSBQUkl1TUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsdSIgOiAibGx1IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeE1BWAorIyBkZWZpbmUgUFJJeE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibHgiIDogImxseCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhNQVgKKyMgZGVmaW5lIFBSSVhNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxYIiA6ICJsbFgiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJZFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkUFRSCisjIGRlZmluZSBQUklkUFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxkIiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiZCIgOiBcCisgICAibGxkIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWlQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaVBUUgorIyBkZWZpbmUgUFJJaVBUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsaSIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gImkiIDogXAorICAgImxsaSIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9QVFIKKyMgZGVmaW5lIFBSSW9QVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibG8iIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJvIiA6IFwKKyAgICJsbG8iKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJdVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1UFRSCisjIGRlZmluZSBQUkl1UFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx1IiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAidSIgOiBcCisgICAibGx1IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXhQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeFBUUgorIyBkZWZpbmUgUFJJeFBUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJseCIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIngiIDogXAorICAgImxseCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhQVFIKKyMgZGVmaW5lIFBSSVhQVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibFgiIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJYIiA6IFwKKyAgICJsbFgiKQorI2VuZGlmCiAKIC8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KIApAQCAtNDQsNyArNDU3LDYgQEAKIC8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCiAgICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKICAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGZzdGF0ICBfX2ZzdGF0CiAjIGRlZmluZSBvcGVuICAgX19vcGVuCiAjIGRlZmluZSBjbG9zZSAgX19jbG9zZQogIyBkZWZpbmUgcmVhZCAgIF9fcmVhZApAQCAtNTIsMzAgKzQ2NCw0NzEgQEAKICMgZGVmaW5lIG11bm1hcCBfX211bm1hcAogI2VuZGlmCiAKKy8qIEZvciB0aG9zZSBsb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisgICBzb21lIGFkZGl0aW9uYWwgY29kZSBlbXVsYXRpbmcgaXQuICAqLworI2lmZGVmIEhBVkVfQUxMT0NBCisjIGRlZmluZSBmcmVlYShwKSAvKiBub3RoaW5nICovCisjZWxzZQorIyBkZWZpbmUgYWxsb2NhKG4pIG1hbGxvYyAobikKKyMgZGVmaW5lIGZyZWVhKHApIGZyZWUgKHApCisjZW5kaWYKKworLyogRm9yIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBJL08uCisgICBPX0JJTkFSWSBpcyB1c3VhbGx5IGRlY2xhcmVkIGluIDxmY250bC5oPi4gKi8KKyNpZiAhZGVmaW5lZCBPX0JJTkFSWSAmJiBkZWZpbmVkIF9PX0JJTkFSWQorICAvKiBGb3IgTVNDLWNvbXBhdGlibGUgY29tcGlsZXJzLiAgKi8KKyMgZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQorIyBkZWZpbmUgT19URVhUIF9PX1RFWFQKKyNlbmRpZgorI2lmZGVmIF9fQkVPU19fCisgIC8qIEJlT1MgNSBoYXMgT19CSU5BUlkgYW5kIE9fVEVYVCwgYnV0IHRoZXkgaGF2ZSBubyBlZmZlY3QuICAqLworIyB1bmRlZiBPX0JJTkFSWQorIyB1bmRlZiBPX1RFWFQKKyNlbmRpZgorLyogT24gcmVhc29uYWJsZSBzeXN0ZW1zLCBiaW5hcnkgSS9PIGlzIHRoZSBkZWZhdWx0LiAgKi8KKyNpZm5kZWYgT19CSU5BUlkKKyMgZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisKIC8qIFdlIG5lZWQgYSBzaWduLCB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQKICAgIHdpdGggYWxsIHRyYW5zbGF0aW9ucy4gIFRoaXMgaXMgaW1wb3J0YW50IGlmIHRoZSB0cmFuc2xhdGlvbnMgYXJlCiAgICBjYWNoZWQgYnkgb25lIG9mIEdDQydzIGZlYXR1cmVzLiAgKi8KLWludCBfbmxfbXNnX2NhdF9jbnRyID0gMDsKK2ludCBfbmxfbXNnX2NhdF9jbnRyOwogCiAKKy8qIEV4cGFuZCBhIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQuICBSZXR1cm4gTlVMTCBpZiB1bnN1cHBvcnRlZC4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfc3lzZGVwX3NlZ21lbnRfdmFsdWUgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIC8qIFRlc3QgZm9yIGFuIElTTyBDIDk5IHNlY3Rpb24gNy44LjEgZm9ybWF0IHN0cmluZyBkaXJlY3RpdmUuCisgICAgIFN5bnRheDoKKyAgICAgUCBSIEkgeyBkIHwgaSB8IG8gfCB1IHwgeCB8IFggfQorICAgICB7IHsgfCBMRUFTVCB8IEZBU1QgfSB7IDggfCAxNiB8IDMyIHwgNjQgfSB8IE1BWCB8IFBUUiB9ICAqLworICAvKiBXZSBkb24ndCB1c2UgYSB0YWJsZSBvZiAxNCB0aW1lcyA2ICdjb25zdCBjaGFyIConIHN0cmluZ3MgaGVyZSwgYmVjYXVzZQorICAgICBkYXRhIHJlbG9jYXRpb25zIGNvc3Qgc3RhcnR1cCB0aW1lLiAgKi8KKyAgaWYgKG5hbWVbMF0gPT0gJ1AnICYmIG5hbWVbMV0gPT0gJ1InICYmIG5hbWVbMl0gPT0gJ0knKQorICAgIHsKKyAgICAgIGlmIChuYW1lWzNdID09ICdkJyB8fCBuYW1lWzNdID09ICdpJyB8fCBuYW1lWzNdID09ICdvJyB8fCBuYW1lWzNdID09ICd1JworCSAgfHwgbmFtZVszXSA9PSAneCcgfHwgbmFtZVszXSA9PSAnWCcpCisJeworCSAgaWYgKG5hbWVbNF0gPT0gJzgnICYmIG5hbWVbNV0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWQ4OworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWk4OworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW84OworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXU4OworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXg4OworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVg4OworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnMScgJiYgbmFtZVs1XSA9PSAnNicgJiYgbmFtZVs2XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZDE2OworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWkxNjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvMTY7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdTE2OworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXgxNjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYMTY7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICczJyAmJiBuYW1lWzVdID09ICcyJyAmJiBuYW1lWzZdID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisJCXJldHVybiBQUklkMzI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaTMyOworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW8zMjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisJCXJldHVybiBQUkl1MzI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeDMyOworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVgzMjsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJzYnICYmIG5hbWVbNV0gPT0gJzQnICYmIG5hbWVbNl0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWQ2NDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpNjQ7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQlyZXR1cm4gUFJJbzY0OworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXU2NDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4NjQ7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQlyZXR1cm4gUFJJWDY0OworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnTCcgJiYgbmFtZVs1XSA9PSAnRScgJiYgbmFtZVs2XSA9PSAnQScKKwkgICAgICAmJiBuYW1lWzddID09ICdTJyAmJiBuYW1lWzhdID09ICdUJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzldID09ICc4JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9MRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhMRUFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhMRUFTVDg7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs5XSA9PSAnMScgJiYgbmFtZVsxMF0gPT0gJzYnICYmIG5hbWVbMTFdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZExFQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlMRUFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvTEVBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUxFQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhMRUFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYTEVBU1QxNjsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzldID09ICczJyAmJiBuYW1lWzEwXSA9PSAnMicgJiYgbmFtZVsxMV0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkTEVBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUxFQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9MRUFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1TEVBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeExFQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhMRUFTVDMyOworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOV0gPT0gJzYnICYmIG5hbWVbMTBdID09ICc0JyAmJiBuYW1lWzExXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRMRUFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpTEVBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0xFQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVMRUFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4TEVBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWExFQVNUNjQ7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJ0YnICYmIG5hbWVbNV0gPT0gJ0EnICYmIG5hbWVbNl0gPT0gJ1MnCisJICAgICAgJiYgbmFtZVs3XSA9PSAnVCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVs4XSA9PSAnOCcgJiYgbmFtZVs5XSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRGQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUZBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvRkFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVGQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeEZBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYRkFTVDg7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs4XSA9PSAnMScgJiYgbmFtZVs5XSA9PSAnNicgJiYgbmFtZVsxMF0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkRkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpRkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvRkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1RkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4RkFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYRkFTVDE2OworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOF0gPT0gJzMnICYmIG5hbWVbOV0gPT0gJzInICYmIG5hbWVbMTBdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZEZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0ZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeEZBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWEZBU1QzMjsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzhdID09ICc2JyAmJiBuYW1lWzldID09ICc0JyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9GQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhGQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhGQVNUNjQ7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJ00nICYmIG5hbWVbNV0gPT0gJ0EnICYmIG5hbWVbNl0gPT0gJ1gnCisJICAgICAgJiYgbmFtZVs3XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZE1BWDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpTUFYOworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW9NQVg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdU1BWDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4TUFYOworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVhNQVg7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICdQJyAmJiBuYW1lWzVdID09ICdUJyAmJiBuYW1lWzZdID09ICdSJworCSAgICAgICYmIG5hbWVbN10gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWRQVFI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaVBUUjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvUFRSOworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXVQVFI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeFBUUjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYUFRSOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJfQorICAgIH0KKyAgLyogVGVzdCBmb3IgYSBnbGliYyBzcGVjaWZpYyBwcmludGYoKSBmb3JtYXQgZGlyZWN0aXZlIGZsYWcuICAqLworICBpZiAobmFtZVswXSA9PSAnSScgJiYgbmFtZVsxXSA9PSAnXDAnKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKQorICAgICAgLyogVGhlICdJJyBmbGFnLCBpbiBudW1lcmljIGZvcm1hdCBkaXJlY3RpdmVzLCByZXBsYWNlcyBBU0NJSSBkaWdpdHMKKwkgd2l0aCB0aGUgJ291dGRpZ2l0cycgZGVmaW5lZCBpbiB0aGUgTENfQ1RZUEUgbG9jYWxlIGZhY2V0LiAgVGhpcyBpcworCSB1c2VkIGZvciBGYXJzaSAoUGVyc2lhbikgYW5kIG1heWJlIEFyYWJpYy4gICovCisgICAgICByZXR1cm4gIkkiOworI2Vsc2UKKyAgICAgIHJldHVybiAiIjsKKyNlbmRpZgorICAgIH0KKyAgLyogT3RoZXIgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIGFyZSBub3QgdmFsaWQuICAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgY29kZXNldCBkZXBlbmRlbnQgcGFydHMgb2YgYW4gb3BlbmVkIG1lc3NhZ2UgY2F0YWxvZy4KKyAgIFJldHVybiB0aGUgaGVhZGVyIGVudHJ5LiAgKi8KK2NvbnN0IGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF9pbml0X2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKwkJICAgICAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbiwKKwkJICAgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCit7CisgIC8qIEZpbmQgb3V0IGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0IHRoZSBmaWxlIGlzIGVuY29kZWQgd2l0aC4KKyAgICAgVGhpcyBjYW4gYmUgZm91bmQgKGluIHRleHR1YWwgZm9ybSkgaW4gdGhlIGVudHJ5ICIiLiAgSWYgdGhpcworICAgICBlbnRyeSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGBjaGFyc2V0PScKKyAgICAgaW5mb3JtYXRpb24sIHdlIHdpbGwgYXNzdW1lIHRoZSBjaGFyc2V0IG1hdGNoZXMgdGhlIG9uZSB0aGUKKyAgICAgY3VycmVudCBsb2NhbGUgYW5kIHdlIGRvbid0IGhhdmUgdG8gcGVyZm9ybSBhbnkgY29udmVyc2lvbi4gICovCisgIGNoYXIgKm51bGxlbnRyeTsKKyAgc2l6ZV90IG51bGxlbnRyeWxlbjsKKworICAvKiBQcmVpbml0aWFsaXplIGZpZWxkcywgdG8gYXZvaWQgcmVjdXJzaW9uIGR1cmluZyBfbmxfZmluZF9tc2cuICAqLworICBkb21haW4tPmNvZGVzZXRfY250ciA9CisgICAgKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCA/IGRvbWFpbmJpbmRpbmctPmNvZGVzZXRfY250ciA6IDApOworI2lmZGVmIF9MSUJDCisgIGRvbWFpbi0+Y29udiA9IChfX2djb252X3QpIC0xOworI2Vsc2UKKyMgaWYgSEFWRV9JQ09OVgorICBkb21haW4tPmNvbnYgPSAoaWNvbnZfdCkgLTE7CisjIGVuZGlmCisjZW5kaWYKKyAgZG9tYWluLT5jb252X3RhYiA9IE5VTEw7CisKKyAgLyogR2V0IHRoZSBoZWFkZXIgZW50cnkuICAqLworICBudWxsZW50cnkgPSBfbmxfZmluZF9tc2cgKGRvbWFpbl9maWxlLCBkb21haW5iaW5kaW5nLCAiIiwgJm51bGxlbnRyeWxlbik7CisKKyAgaWYgKG51bGxlbnRyeSAhPSBOVUxMKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IEhBVkVfSUNPTlYKKyAgICAgIGNvbnN0IGNoYXIgKmNoYXJzZXRzdHI7CisKKyAgICAgIGNoYXJzZXRzdHIgPSBzdHJzdHIgKG51bGxlbnRyeSwgImNoYXJzZXQ9Iik7CisgICAgICBpZiAoY2hhcnNldHN0ciAhPSBOVUxMKQorCXsKKwkgIHNpemVfdCBsZW47CisJICBjaGFyICpjaGFyc2V0OworCSAgY29uc3QgY2hhciAqb3V0Y2hhcnNldDsKKworCSAgY2hhcnNldHN0ciArPSBzdHJsZW4gKCJjaGFyc2V0PSIpOworCSAgbGVuID0gc3RyY3NwbiAoY2hhcnNldHN0ciwgIiBcdFxuIik7CisKKwkgIGNoYXJzZXQgPSAoY2hhciAqKSBhbGxvY2EgKGxlbiArIDEpOworIyBpZiBkZWZpbmVkIF9MSUJDIHx8IEhBVkVfTUVNUENQWQorCSAgKigoY2hhciAqKSBtZW1wY3B5IChjaGFyc2V0LCBjaGFyc2V0c3RyLCBsZW4pKSA9ICdcMCc7CisjIGVsc2UKKwkgIG1lbWNweSAoY2hhcnNldCwgY2hhcnNldHN0ciwgbGVuKTsKKwkgIGNoYXJzZXRbbGVuXSA9ICdcMCc7CisjIGVuZGlmCisKKwkgIC8qIFRoZSBvdXRwdXQgY2hhcnNldCBzaG91bGQgbm9ybWFsbHkgYmUgZGV0ZXJtaW5lZCBieSB0aGUKKwkgICAgIGxvY2FsZS4gIEJ1dCBzb21ldGltZXMgdGhlIGxvY2FsZSBpcyBub3QgdXNlZCBvciBub3QgY29ycmVjdGx5CisJICAgICBzZXQgdXAsIHNvIHdlIHByb3ZpZGUgYSBwb3NzaWJpbGl0eSBmb3IgdGhlIHVzZXIgdG8gb3ZlcnJpZGUKKwkgICAgIHRoaXMuICBNb3Jlb3ZlciwgdGhlIHZhbHVlIHNwZWNpZmllZCB0aHJvdWdoCisJICAgICBiaW5kX3RleHRkb21haW5fY29kZXNldCBvdmVycmlkZXMgYm90aC4gICovCisJICBpZiAoZG9tYWluYmluZGluZyAhPSBOVUxMICYmIGRvbWFpbmJpbmRpbmctPmNvZGVzZXQgIT0gTlVMTCkKKwkgICAgb3V0Y2hhcnNldCA9IGRvbWFpbmJpbmRpbmctPmNvZGVzZXQ7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBvdXRjaGFyc2V0ID0gZ2V0ZW52ICgiT1VUUFVUX0NIQVJTRVQiKTsKKwkgICAgICBpZiAob3V0Y2hhcnNldCA9PSBOVUxMIHx8IG91dGNoYXJzZXRbMF0gPT0gJ1wwJykKKwkJeworIyBpZmRlZiBfTElCQworCQkgIG91dGNoYXJzZXQgPSBfTkxfQ1VSUkVOVCAoTENfQ1RZUEUsIENPREVTRVQpOworIyBlbHNlCisjICBpZiBIQVZFX0lDT05WCisJCSAgZXh0ZXJuIGNvbnN0IGNoYXIgKmxvY2FsZV9jaGFyc2V0ICh2b2lkKTsKKwkJICBvdXRjaGFyc2V0ID0gbG9jYWxlX2NoYXJzZXQgKCk7CisjICBlbmRpZgorIyBlbmRpZgorCQl9CisJICAgIH0KKworIyBpZmRlZiBfTElCQworCSAgLyogV2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCisJICBvdXRjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAob3V0Y2hhcnNldCwgIlRSQU5TTElUIik7CisJICBjaGFyc2V0ID0gbm9ybV9hZGRfc2xhc2hlcyAoY2hhcnNldCwgTlVMTCk7CisJICBpZiAoX19nY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0LCAmZG9tYWluLT5jb252LAorCQkJICAgIEdDT05WX0FWT0lEX05PQ09OVikKKwkgICAgICAhPSBfX0dDT05WX09LKQorCSAgICBkb21haW4tPmNvbnYgPSAoX19nY29udl90KSAtMTsKKyMgZWxzZQorIyAgaWYgSEFWRV9JQ09OVgorCSAgLyogV2hlbiB1c2luZyBHTlUgbGliYyA+PSAyLjIgb3IgR05VIGxpYmljb252ID49IDEuNSwKKwkgICAgIHdlIHdhbnQgdG8gdXNlIHRyYW5zbGl0ZXJhdGlvbi4gICovCisjICAgaWYgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAyKSB8fCBfX0dMSUJDX18gPiAyIFwKKyAgICAgICB8fCBfTElCSUNPTlZfVkVSU0lPTiA+PSAweDAxMDUKKwkgIGlmIChzdHJjaHIgKG91dGNoYXJzZXQsICcvJykgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGNoYXIgKnRtcDsKKworCSAgICAgIGxlbiA9IHN0cmxlbiAob3V0Y2hhcnNldCk7CisJICAgICAgdG1wID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxMCArIDEpOworCSAgICAgIG1lbWNweSAodG1wLCBvdXRjaGFyc2V0LCBsZW4pOworCSAgICAgIG1lbWNweSAodG1wICsgbGVuLCAiLy9UUkFOU0xJVCIsIDEwICsgMSk7CisJICAgICAgb3V0Y2hhcnNldCA9IHRtcDsKKworCSAgICAgIGRvbWFpbi0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOworCisJICAgICAgZnJlZWEgKG91dGNoYXJzZXQpOworCSAgICB9CisJICBlbHNlCisjICAgZW5kaWYKKwkgICAgZG9tYWluLT5jb252ID0gaWNvbnZfb3BlbiAob3V0Y2hhcnNldCwgY2hhcnNldCk7CisjICBlbmRpZgorIyBlbmRpZgorCisJICBmcmVlYSAoY2hhcnNldCk7CisJfQorI2VuZGlmIC8qIF9MSUJDIHx8IEhBVkVfSUNPTlYgKi8KKyAgICB9CisKKyAgcmV0dXJuIG51bGxlbnRyeTsKK30KKworLyogRnJlZXMgdGhlIGNvZGVzZXQgZGVwZW5kZW50IHBhcnRzIG9mIGFuIG9wZW5lZCBtZXNzYWdlIGNhdGFsb2cuICAqLwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF9mcmVlX2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluKQoreworICBpZiAoZG9tYWluLT5jb252X3RhYiAhPSBOVUxMICYmIGRvbWFpbi0+Y29udl90YWIgIT0gKGNoYXIgKiopIC0xKQorICAgIGZyZWUgKGRvbWFpbi0+Y29udl90YWIpOworCisjaWZkZWYgX0xJQkMKKyAgaWYgKGRvbWFpbi0+Y29udiAhPSAoX19nY29udl90KSAtMSkKKyAgICBfX2djb252X2Nsb3NlIChkb21haW4tPmNvbnYpOworI2Vsc2UKKyMgaWYgSEFWRV9JQ09OVgorICBpZiAoZG9tYWluLT5jb252ICE9IChpY29udl90KSAtMSkKKyAgICBpY29udl9jbG9zZSAoZG9tYWluLT5jb252KTsKKyMgZW5kaWYKKyNlbmRpZgorfQorCiAvKiBMb2FkIHRoZSBtZXNzYWdlIGNhdGFsb2dzIHNwZWNpZmllZCBieSBGSUxFTkFNRS4gIElmIGl0IGlzIG5vIHZhbGlkCiAgICBtZXNzYWdlIGNhdGFsb2cgZG8gbm90aGluZy4gICovCiB2b2lkCi1fbmxfbG9hZF9kb21haW4gKGRvbWFpbl9maWxlKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZTsKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfbG9hZF9kb21haW4gKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorCQkgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcpCiB7CiAgIGludCBmZDsKKyAgc2l6ZV90IHNpemU7CisjaWZkZWYgX0xJQkMKKyAgc3RydWN0IHN0YXQ2NCBzdDsKKyNlbHNlCiAgIHN0cnVjdCBzdGF0IHN0OworI2VuZGlmCiAgIHN0cnVjdCBtb19maWxlX2hlYWRlciAqZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTE7Ci0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKICAgaW50IHVzZV9tbWFwID0gMDsKLSNlbmRpZgogICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOworICBpbnQgcmV2aXNpb247CisgIGNvbnN0IGNoYXIgKm51bGxlbnRyeTsKIAogICBkb21haW5fZmlsZS0+ZGVjaWRlZCA9IDE7CiAgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKIAorICAvKiBOb3RlIHRoYXQgaXQgd291bGQgYmUgdXNlbGVzcyB0byBzdG9yZSBkb21haW5iaW5kaW5nIGluIGRvbWFpbl9maWxlCisgICAgIGJlY2F1c2UgZG9tYWluYmluZGluZyBtaWdodCBiZSA9PSBOVUxMIG5vdyBidXQgIT0gTlVMTCBsYXRlciAoYWZ0ZXIKKyAgICAgYSBjYWxsIHRvIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KS4gICovCisKICAgLyogSWYgdGhlIHJlY29yZCBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCBsb2NhbGUgdGhlIEZJTEVOQU1FCiAgICAgIG1pZ2h0IGJlIE5VTEwuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCiAgICAgIHNwZWNpZmljYXRpb24gdGhlIGxvY2FsZSBmaWxlIG5hbWUgaXMgZGlmZmVyZW50IGZvciBYUEcgYW5kIENFTgpAQCAtODQsMjcgKzkzNywzMiBAQAogICAgIHJldHVybjsKIAogICAvKiBUcnkgdG8gb3BlbiB0aGUgYWRkcmVzc2VkIGZpbGUuICAqLwotICBmZCA9IG9wZW4gKGRvbWFpbl9maWxlLT5maWxlbmFtZSwgT19SRE9OTFkpOworICBmZCA9IG9wZW4gKGRvbWFpbl9maWxlLT5maWxlbmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CiAgIGlmIChmZCA9PSAtMSkKICAgICByZXR1cm47CiAKICAgLyogV2UgbXVzdCBrbm93IGFib3V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGZzdGF0IChmZCwgJnN0KSAhPSAwCi0gICAgICAmJiBzdC5zdF9zaXplIDwgKG9mZl90KSBzaXplb2YgKHN0cnVjdCBtb19maWxlX2hlYWRlcikpCisgIGlmICgKKyNpZmRlZiBfTElCQworICAgICAgX19idWlsdGluX2V4cGVjdCAoZnN0YXQ2NCAoZmQsICZzdCkgIT0gMCwgMCkKKyNlbHNlCisgICAgICBfX2J1aWx0aW5fZXhwZWN0IChmc3RhdCAoZmQsICZzdCkgIT0gMCwgMCkKKyNlbmRpZgorICAgICAgfHwgX19idWlsdGluX2V4cGVjdCAoKHNpemUgPSAoc2l6ZV90KSBzdC5zdF9zaXplKSAhPSBzdC5zdF9zaXplLCAwKQorICAgICAgfHwgX19idWlsdGluX2V4cGVjdCAoc2l6ZSA8IHNpemVvZiAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyKSwgMCkpCiAgICAgewogICAgICAgLyogU29tZXRoaW5nIHdlbnQgd3JvbmcuICAqLwogICAgICAgY2xvc2UgKGZkKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQworI2lmZGVmIEhBVkVfTU1BUAogICAvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIGxvYWQgdGhlIGZpbGUuICBJZiBtbWFwKCkgaXMgYXZhaWxhYmxlIHdlIHRyeQogICAgICB0aGlzIGZpcnN0LiAgSWYgbm90IGF2YWlsYWJsZSBvciBpdCBmYWlsZWQgd2UgdHJ5IHRvIGxvYWQgaXQuICAqLwotICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtbWFwIChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUQsCisgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHNpemUsIFBST1RfUkVBRCwKIAkJCQkJIE1BUF9QUklWQVRFLCBmZCwgMCk7CiAKLSAgaWYgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSwgMSkpCiAgICAgewogICAgICAgLyogbW1hcCgpIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLwogICAgICAgY2xvc2UgKGZkKTsKQEAgLTExNiwyNCArOTc0LDI3IEBACiAgICAgIGl0IG1hbnVhbGx5LiAgKi8KICAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKICAgICB7Ci0gICAgICBvZmZfdCB0b19yZWFkOworICAgICAgc2l6ZV90IHRvX3JlYWQ7CiAgICAgICBjaGFyICpyZWFkX3B0cjsKIAotICAgICAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbWFsbG9jIChzdC5zdF9zaXplKTsKKyAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc2l6ZSk7CiAgICAgICBpZiAoZGF0YSA9PSBOVUxMKQogCXJldHVybjsKIAotICAgICAgdG9fcmVhZCA9IHN0LnN0X3NpemU7CisgICAgICB0b19yZWFkID0gc2l6ZTsKICAgICAgIHJlYWRfcHRyID0gKGNoYXIgKikgZGF0YTsKICAgICAgIGRvCiAJewogCSAgbG9uZyBpbnQgbmIgPSAobG9uZyBpbnQpIHJlYWQgKGZkLCByZWFkX3B0ciwgdG9fcmVhZCk7Ci0JICBpZiAobmIgPT0gLTEpCisJICBpZiAobmIgPD0gMCkKIAkgICAgeworI2lmZGVmIEVJTlRSCisJICAgICAgaWYgKG5iID09IC0xICYmIGVycm5vID09IEVJTlRSKQorCQljb250aW51ZTsKKyNlbmRpZgogCSAgICAgIGNsb3NlIChmZCk7CiAJICAgICAgcmV0dXJuOwogCSAgICB9Ci0KIAkgIHJlYWRfcHRyICs9IG5iOwogCSAgdG9fcmVhZCAtPSBuYjsKIAl9CkBAIC0xNDQsNDcgKzEwMDUsMzc4IEBACiAKICAgLyogVXNpbmcgdGhlIG1hZ2ljIG51bWJlciB3ZSBjYW4gdGVzdCB3aGV0aGVyIGl0IHJlYWxseSBpcyBhIG1lc3NhZ2UKICAgICAgY2F0YWxvZyBmaWxlLiAgKi8KLSAgaWYgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCkKKyAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCwKKwkJCTApKQogICAgIHsKICAgICAgIC8qIFRoZSBtYWdpYyBudW1iZXIgaXMgd3Jvbmc6IG5vdCBhIG1lc3NhZ2UgY2F0YWxvZyBmaWxlLiAgKi8KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQworI2lmZGVmIEhBVkVfTU1BUAogICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOworCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHNpemUpOwogICAgICAgZWxzZQogI2VuZGlmCiAJZnJlZSAoZGF0YSk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gIGRvbWFpbl9maWxlLT5kYXRhCi0gICAgPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2FkZWRfZG9tYWluKSk7Ci0gIGlmIChkb21haW5fZmlsZS0+ZGF0YSA9PSBOVUxMKQorICBkb21haW4gPSAoc3RydWN0IGxvYWRlZF9kb21haW4gKikgbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2FkZWRfZG9tYWluKSk7CisgIGlmIChkb21haW4gPT0gTlVMTCkKICAgICByZXR1cm47CisgIGRvbWFpbl9maWxlLT5kYXRhID0gZG9tYWluOwogCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKICAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKKyAgZG9tYWluLT51c2VfbW1hcCA9IHVzZV9tbWFwOworICBkb21haW4tPm1tYXBfc2l6ZSA9IHNpemU7CiAgIGRvbWFpbi0+bXVzdF9zd2FwID0gZGF0YS0+bWFnaWMgIT0gX01BR0lDOworICBkb21haW4tPm1hbGxvY2VkID0gTlVMTDsKIAogICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXZhaWxhYmxlIHRhYmxlcy4gICovCi0gIHN3aXRjaCAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKSkKKyAgcmV2aXNpb24gPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+cmV2aXNpb24pOworICAvKiBXZSBzdXBwb3J0IG9ubHkgdGhlIG1ham9yIHJldmlzaW9ucyAwIGFuZCAxLiAgKi8KKyAgc3dpdGNoIChyZXZpc2lvbiA+PiAxNikKICAgICB7CiAgICAgY2FzZSAwOgorICAgIGNhc2UgMToKICAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOwotICAgICAgZG9tYWluLT5vcmlnX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKKyAgICAgIGRvbWFpbi0+b3JpZ190YWIgPSAoY29uc3Qgc3RydWN0IHN0cmluZ19kZXNjICopCiAJKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+b3JpZ190YWJfb2Zmc2V0KSk7Ci0gICAgICBkb21haW4tPnRyYW5zX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKKyAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqKQogCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3RhYl9vZmZzZXQpKTsKICAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOwotICAgICAgZG9tYWluLT5oYXNoX3RhYiA9IChubHNfdWludDMyICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSk7CisgICAgICBkb21haW4tPmhhc2hfdGFiID0KKwkoZG9tYWluLT5oYXNoX3NpemUgPiAyCisJID8gKGNvbnN0IG5sc191aW50MzIgKikKKwkgICAoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9vZmZzZXQpKQorCSA6IE5VTEwpOworICAgICAgZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIgPSBkb21haW4tPm11c3Rfc3dhcDsKKworICAgICAgLyogTm93IGRpc3BhdGNoIG9uIHRoZSBtaW5vciByZXZpc2lvbi4gICovCisgICAgICBzd2l0Y2ggKHJldmlzaW9uICYgMHhmZmZmKQorCXsKKwljYXNlIDA6CisJICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSAwOworCSAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBOVUxMOworCSAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKKwkgIGJyZWFrOworCWNhc2UgMToKKwlkZWZhdWx0OgorCSAgeworCSAgICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7CisKKwkgICAgaWYgKGRvbWFpbi0+aGFzaF90YWIgPT0gTlVMTCkKKwkgICAgICAvKiBUaGlzIGlzIGludmFsaWQuICBUaGVzZSBtaW5vciByZXZpc2lvbnMgbmVlZCBhIGhhc2ggdGFibGUuICAqLworCSAgICAgIGdvdG8gaW52YWxpZDsKKworCSAgICBuX3N5c2RlcF9zdHJpbmdzID0KKwkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bl9zeXNkZXBfc3RyaW5ncyk7CisJICAgIGlmIChuX3N5c2RlcF9zdHJpbmdzID4gMCkKKwkgICAgICB7CisJCW5sc191aW50MzIgbl9zeXNkZXBfc2VnbWVudHM7CisJCWNvbnN0IHN0cnVjdCBzeXNkZXBfc2VnbWVudCAqc3lzZGVwX3NlZ21lbnRzOworCQljb25zdCBjaGFyICoqc3lzZGVwX3NlZ21lbnRfdmFsdWVzOworCQljb25zdCBubHNfdWludDMyICpvcmlnX3N5c2RlcF90YWI7CisJCWNvbnN0IG5sc191aW50MzIgKnRyYW5zX3N5c2RlcF90YWI7CisJCW5sc191aW50MzIgbl9pbm1lbV9zeXNkZXBfc3RyaW5nczsKKwkJc2l6ZV90IG1lbW5lZWQ7CisJCWNoYXIgKm1lbTsKKwkJc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqaW5tZW1fb3JpZ19zeXNkZXBfdGFiOworCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV90cmFuc19zeXNkZXBfdGFiOworCQlubHNfdWludDMyICppbm1lbV9oYXNoX3RhYjsKKwkJdW5zaWduZWQgaW50IGksIGo7CisKKwkJLyogR2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudHMuICAqLworCQluX3N5c2RlcF9zZWdtZW50cyA9CisJCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5fc3lzZGVwX3NlZ21lbnRzKTsKKwkJc3lzZGVwX3NlZ21lbnRzID0gKGNvbnN0IHN0cnVjdCBzeXNkZXBfc2VnbWVudCAqKQorCQkgICgoY2hhciAqKSBkYXRhCisJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnN5c2RlcF9zZWdtZW50c19vZmZzZXQpKTsKKwkJc3lzZGVwX3NlZ21lbnRfdmFsdWVzID0KKwkJICBhbGxvY2EgKG5fc3lzZGVwX3NlZ21lbnRzICogc2l6ZW9mIChjb25zdCBjaGFyICopKTsKKwkJZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3NlZ21lbnRzOyBpKyspCisJCSAgeworCQkgICAgY29uc3QgY2hhciAqbmFtZSA9CisJCSAgICAgIChjaGFyICopIGRhdGEKKwkJICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3NlZ21lbnRzW2ldLm9mZnNldCk7CisJCSAgICBubHNfdWludDMyIG5hbWVsZW4gPQorCQkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgc3lzZGVwX3NlZ21lbnRzW2ldLmxlbmd0aCk7CisKKwkJICAgIGlmICghKG5hbWVsZW4gPiAwICYmIG5hbWVbbmFtZWxlbiAtIDFdID09ICdcMCcpKQorCQkgICAgICB7CisJCQlmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKKwkJCWdvdG8gaW52YWxpZDsKKwkJICAgICAgfQorCisJCSAgICBzeXNkZXBfc2VnbWVudF92YWx1ZXNbaV0gPSBnZXRfc3lzZGVwX3NlZ21lbnRfdmFsdWUgKG5hbWUpOworCQkgIH0KKworCQlvcmlnX3N5c2RlcF90YWIgPSAoY29uc3QgbmxzX3VpbnQzMiAqKQorCQkgICgoY2hhciAqKSBkYXRhCisJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm9yaWdfc3lzZGVwX3RhYl9vZmZzZXQpKTsKKwkJdHJhbnNfc3lzZGVwX3RhYiA9IChjb25zdCBubHNfdWludDMyICopCisJCSAgKChjaGFyICopIGRhdGEKKwkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+dHJhbnNfc3lzZGVwX3RhYl9vZmZzZXQpKTsKKworCQkvKiBDb21wdXRlIHRoZSBhbW91bnQgb2YgYWRkaXRpb25hbCBtZW1vcnkgbmVlZGVkIGZvciB0aGUKKwkJICAgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzIGFuZCB0aGUgYXVnbWVudGVkIGhhc2ggdGFibGUuCisJCSAgIEF0IHRoZSBzYW1lIHRpbWUsIGFsc28gZHJvcCBzdHJpbmcgcGFpcnMgd2hpY2ggcmVmZXIgdG8KKwkJICAgYW4gdW5kZWZpbmVkIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudC4gICovCisJCW5faW5tZW1fc3lzZGVwX3N0cmluZ3MgPSAwOworCQltZW1uZWVkID0gZG9tYWluLT5oYXNoX3NpemUgKiBzaXplb2YgKG5sc191aW50MzIpOworCQlmb3IgKGkgPSAwOyBpIDwgbl9zeXNkZXBfc3RyaW5nczsgaSsrKQorCQkgIHsKKwkJICAgIGludCB2YWxpZCA9IDE7CisJCSAgICBzaXplX3QgbmVlZHNbMl07CisKKwkJICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisJCSAgICAgIHsKKwkJCWNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICpzeXNkZXBfc3RyaW5nID0KKwkJCSAgKGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICopCisJCQkgICgoY2hhciAqKSBkYXRhCisJCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorCQkJCWogPT0gMAorCQkJCT8gb3JpZ19zeXNkZXBfdGFiW2ldCisJCQkJOiB0cmFuc19zeXNkZXBfdGFiW2ldKSk7CisJCQlzaXplX3QgbmVlZCA9IDA7CisJCQljb25zdCBzdHJ1Y3Qgc2VnbWVudF9wYWlyICpwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7CisKKwkJCWlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKSAhPSBTRUdNRU5UU19FTkQpCisJCQkgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQorCQkJICAgIHsKKwkJCSAgICAgIG5sc191aW50MzIgc3lzZGVwcmVmOworCisJCQkgICAgICBuZWVkICs9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKKworCQkJICAgICAgc3lzZGVwcmVmID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7CisJCQkgICAgICBpZiAoc3lzZGVwcmVmID09IFNFR01FTlRTX0VORCkKKwkJCQlicmVhazsKKworCQkJICAgICAgaWYgKHN5c2RlcHJlZiA+PSBuX3N5c2RlcF9zZWdtZW50cykKKwkJCQl7CisJCQkJICAvKiBJbnZhbGlkLiAgKi8KKwkJCQkgIGZyZWVhIChzeXNkZXBfc2VnbWVudF92YWx1ZXMpOworCQkJCSAgZ290byBpbnZhbGlkOworCQkJCX0KKworCQkJICAgICAgaWYgKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdID09IE5VTEwpCisJCQkJeworCQkJCSAgLyogVGhpcyBwYXJ0aWN1bGFyIHN0cmluZyBwYWlyIGlzIGludmFsaWQuICAqLworCQkJCSAgdmFsaWQgPSAwOworCQkJCSAgYnJlYWs7CisJCQkJfQorCisJCQkgICAgICBuZWVkICs9IHN0cmxlbiAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzW3N5c2RlcHJlZl0pOworCQkJICAgIH0KKworCQkJbmVlZHNbal0gPSBuZWVkOworCQkJaWYgKCF2YWxpZCkKKwkJCSAgYnJlYWs7CisJCSAgICAgIH0KKworCQkgICAgaWYgKHZhbGlkKQorCQkgICAgICB7CisJCQluX2lubWVtX3N5c2RlcF9zdHJpbmdzKys7CisJCQltZW1uZWVkICs9IG5lZWRzWzBdICsgbmVlZHNbMV07CisJCSAgICAgIH0KKwkJICB9CisJCW1lbW5lZWQgKz0gMiAqIG5faW5tZW1fc3lzZGVwX3N0cmluZ3MKKwkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKKworCQlpZiAobl9pbm1lbV9zeXNkZXBfc3RyaW5ncyA+IDApCisJCSAgeworCQkgICAgdW5zaWduZWQgaW50IGs7CisKKwkJICAgIC8qIEFsbG9jYXRlIGFkZGl0aW9uYWwgbWVtb3J5LiAgKi8KKwkJICAgIG1lbSA9IChjaGFyICopIG1hbGxvYyAobWVtbmVlZCk7CisJCSAgICBpZiAobWVtID09IE5VTEwpCisJCSAgICAgIGdvdG8gaW52YWxpZDsKKworCQkgICAgZG9tYWluLT5tYWxsb2NlZCA9IG1lbTsKKwkJICAgIGlubWVtX29yaWdfc3lzZGVwX3RhYiA9IChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICopIG1lbTsKKwkJICAgIG1lbSArPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzCisJCQkgICAqIHNpemVvZiAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyk7CisJCSAgICBpbm1lbV90cmFuc19zeXNkZXBfdGFiID0gKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKikgbWVtOworCQkgICAgbWVtICs9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MKKwkJCSAgICogc2l6ZW9mIChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjKTsKKwkJICAgIGlubWVtX2hhc2hfdGFiID0gKG5sc191aW50MzIgKikgbWVtOworCQkgICAgbWVtICs9IGRvbWFpbi0+aGFzaF9zaXplICogc2l6ZW9mIChubHNfdWludDMyKTsKKworCQkgICAgLyogQ29tcHV0ZSB0aGUgc3lzdGVtIGRlcGVuZGVudCBzdHJpbmdzLiAgKi8KKwkJICAgIGsgPSAwOworCQkgICAgZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3N0cmluZ3M7IGkrKykKKwkJICAgICAgeworCQkJaW50IHZhbGlkID0gMTsKKworCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJCSAgeworCQkJICAgIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICpzeXNkZXBfc3RyaW5nID0KKwkJCSAgICAgIChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqKQorCQkJICAgICAgKChjaGFyICopIGRhdGEKKwkJCSAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorCQkJCSAgICBqID09IDAKKwkJCQkgICAgPyBvcmlnX3N5c2RlcF90YWJbaV0KKwkJCQkgICAgOiB0cmFuc19zeXNkZXBfdGFiW2ldKSk7CisJCQkgICAgY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9CisJCQkgICAgICBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czsKKworCQkJICAgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKQorCQkJCSE9IFNFR01FTlRTX0VORCkKKwkJCSAgICAgIGZvciAocCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOzsgcCsrKQorCQkJCXsKKwkJCQkgIG5sc191aW50MzIgc3lzZGVwcmVmOworCisJCQkJICBzeXNkZXByZWYgPQorCQkJCSAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c3lzZGVwcmVmKTsKKwkJCQkgIGlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQorCQkJCSAgICBicmVhazsKKworCQkJCSAgaWYgKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdID09IE5VTEwpCisJCQkJICAgIHsKKwkJCQkgICAgICAvKiBUaGlzIHBhcnRpY3VsYXIgc3RyaW5nIHBhaXIgaXMKKwkJCQkJIGludmFsaWQuICAqLworCQkJCSAgICAgIHZhbGlkID0gMDsKKwkJCQkgICAgICBicmVhazsKKwkJCQkgICAgfQorCQkJCX0KKworCQkJICAgIGlmICghdmFsaWQpCisJCQkgICAgICBicmVhazsKKwkJCSAgfQorCisJCQlpZiAodmFsaWQpCisJCQkgIHsKKwkJCSAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJICAgICAgeworCQkJCWNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nICpzeXNkZXBfc3RyaW5nID0KKwkJCQkgIChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqKQorCQkJCSAgKChjaGFyICopIGRhdGEKKwkJCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorCQkJCQlqID09IDAKKwkJCQkJPyBvcmlnX3N5c2RlcF90YWJbaV0KKwkJCQkJOiB0cmFuc19zeXNkZXBfdGFiW2ldKSk7CisJCQkJY29uc3QgY2hhciAqc3RhdGljX3NlZ21lbnRzID0KKwkJCQkgIChjaGFyICopIGRhdGEKKwkJCQkgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zdHJpbmctPm9mZnNldCk7CisJCQkJY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9CisJCQkJICBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czsKKworCQkJCS8qIENvbmNhdGVuYXRlIHRoZSBzZWdtZW50cywgYW5kIGZpbGwKKwkJCQkgICBpbm1lbV9vcmlnX3N5c2RlcF90YWJba10gKGZvciBqID09IDApIGFuZAorCQkJCSAgIGlubWVtX3RyYW5zX3N5c2RlcF90YWJba10gKGZvciBqID09IDEpLiAgKi8KKworCQkJCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX3RhYl9lbnRyeSA9CisJCQkJICAoaiA9PSAwCisJCQkJICAgPyBpbm1lbV9vcmlnX3N5c2RlcF90YWIKKwkJCQkgICA6IGlubWVtX3RyYW5zX3N5c2RlcF90YWIpCisJCQkJICArIGs7CisKKwkJCQlpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikKKwkJCQkgICAgPT0gU0VHTUVOVFNfRU5EKQorCQkJCSAgeworCQkJCSAgICAvKiBPbmx5IG9uZSBzdGF0aWMgc2VnbWVudC4gICovCisJCQkJICAgIGlubWVtX3RhYl9lbnRyeS0+bGVuZ3RoID0KKwkJCQkgICAgICBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7CisJCQkJICAgIGlubWVtX3RhYl9lbnRyeS0+cG9pbnRlciA9IHN0YXRpY19zZWdtZW50czsKKwkJCQkgIH0KKwkJCQllbHNlCisJCQkJICB7CisJCQkJICAgIGlubWVtX3RhYl9lbnRyeS0+cG9pbnRlciA9IG1lbTsKKworCQkJCSAgICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKKwkJCQkgICAgICB7CisJCQkJCW5sc191aW50MzIgc2Vnc2l6ZSA9CisJCQkJCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOworCQkJCQlubHNfdWludDMyIHN5c2RlcHJlZiA9CisJCQkJCSAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7CisJCQkJCXNpemVfdCBuOworCisJCQkJCWlmIChzZWdzaXplID4gMCkKKwkJCQkJICB7CisJCQkJCSAgICBtZW1jcHkgKG1lbSwgc3RhdGljX3NlZ21lbnRzLCBzZWdzaXplKTsKKwkJCQkJICAgIG1lbSArPSBzZWdzaXplOworCQkJCQkgICAgc3RhdGljX3NlZ21lbnRzICs9IHNlZ3NpemU7CisJCQkJCSAgfQorCisJCQkJCWlmIChzeXNkZXByZWYgPT0gU0VHTUVOVFNfRU5EKQorCQkJCQkgIGJyZWFrOworCisJCQkJCW4gPSBzdHJsZW4gKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdKTsKKwkJCQkJbWVtY3B5IChtZW0sIHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdLCBuKTsKKwkJCQkJbWVtICs9IG47CisJCQkJICAgICAgfQorCisJCQkJICAgIGlubWVtX3RhYl9lbnRyeS0+bGVuZ3RoID0KKwkJCQkgICAgICBtZW0gLSBpbm1lbV90YWJfZW50cnktPnBvaW50ZXI7CisJCQkJICB9CisJCQkgICAgICB9CisKKwkJCSAgICBrKys7CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgaWYgKGsgIT0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncykKKwkJICAgICAgYWJvcnQgKCk7CisKKwkJICAgIC8qIENvbXB1dGUgdGhlIGF1Z21lbnRlZCBoYXNoIHRhYmxlLiAgKi8KKwkJICAgIGZvciAoaSA9IDA7IGkgPCBkb21haW4tPmhhc2hfc2l6ZTsgaSsrKQorCQkgICAgICBpbm1lbV9oYXNoX3RhYltpXSA9CisJCQlXIChkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiwgZG9tYWluLT5oYXNoX3RhYltpXSk7CisJCSAgICBmb3IgKGkgPSAwOyBpIDwgbl9pbm1lbV9zeXNkZXBfc3RyaW5nczsgaSsrKQorCQkgICAgICB7CisJCQljb25zdCBjaGFyICptc2dpZCA9IGlubWVtX29yaWdfc3lzZGVwX3RhYltpXS5wb2ludGVyOworCQkJbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7CisJCQlubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7CisJCQlubHNfdWludDMyIGluY3IgPQorCQkJICAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOworCisJCQlmb3IgKDs7KQorCQkJICB7CisJCQkgICAgaWYgKGlubWVtX2hhc2hfdGFiW2lkeF0gPT0gMCkKKwkJCSAgICAgIHsKKwkJCQkvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgVXNlIGl0LiAgKi8KKwkJCQlpbm1lbV9oYXNoX3RhYltpZHhdID0gMSArIGRvbWFpbi0+bnN0cmluZ3MgKyBpOworCQkJCWJyZWFrOworCQkJICAgICAgfQorCisJCQkgICAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCisJCQkgICAgICBpZHggLT0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyOworCQkJICAgIGVsc2UKKwkJCSAgICAgIGlkeCArPSBpbmNyOworCQkJICB9CisJCSAgICAgIH0KKworCQkgICAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gbl9pbm1lbV9zeXNkZXBfc3RyaW5nczsKKwkJICAgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gaW5tZW1fb3JpZ19zeXNkZXBfdGFiOworCQkgICAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gaW5tZW1fdHJhbnNfc3lzZGVwX3RhYjsKKworCQkgICAgZG9tYWluLT5oYXNoX3RhYiA9IGlubWVtX2hhc2hfdGFiOworCQkgICAgZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIgPSAwOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IDA7CisJCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7CisJCSAgICBkb21haW4tPnRyYW5zX3N5c2RlcF90YWIgPSBOVUxMOworCQkgIH0KKworCQlmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IDA7CisJCWRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKKwkJZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwl9CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBpcyBhbiBpbGxlZ2FsIHJldmlzaW9uLiAgKi8KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQworICAgICAgLyogVGhpcyBpcyBhbiBpbnZhbGlkIHJldmlzaW9uLiAgKi8KKyAgICBpbnZhbGlkOgorICAgICAgLyogVGhpcyBpcyBhbiBpbnZhbGlkIC5tbyBmaWxlLiAgKi8KKyAgICAgIGlmIChkb21haW4tPm1hbGxvY2VkKQorCWZyZWUgKGRvbWFpbi0+bWFsbG9jZWQpOworI2lmZGVmIEhBVkVfTU1BUAogICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOworCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHNpemUpOwogICAgICAgZWxzZQogI2VuZGlmCiAJZnJlZSAoZGF0YSk7CkBAIC0xOTMsNyArMTM4NSwzNiBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAvKiBTaG93IHRoYXQgb25lIGRvbWFpbiBpcyBjaGFuZ2VkLiAgVGhpcyBtaWdodCBtYWtlIHNvbWUgY2FjaGVkCi0gICAgIHRyYW5zbGF0aW9ucyBpbnZhbGlkLiAgKi8KLSAgKytfbmxfbXNnX2NhdF9jbnRyOworICAvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgY2hhcmFjdGVyIHNldCBjb252ZXJ0ZXIgZnJvbSB0aGUgY2hhcmFjdGVyIHNldAorICAgICB0aGUgZmlsZSBpcyBlbmNvZGVkIHdpdGggKGZvdW5kIGluIHRoZSBoZWFkZXIgZW50cnkpIHRvIHRoZSBkb21haW4ncworICAgICBzcGVjaWZpZWQgY2hhcmFjdGVyIHNldCBvciB0aGUgbG9jYWxlJ3MgY2hhcmFjdGVyIHNldC4gICovCisgIG51bGxlbnRyeSA9IF9ubF9pbml0X2RvbWFpbl9jb252IChkb21haW5fZmlsZSwgZG9tYWluLCBkb21haW5iaW5kaW5nKTsKKworICAvKiBBbHNvIGxvb2sgZm9yIGEgcGx1cmFsIHNwZWNpZmljYXRpb24uICAqLworICBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChudWxsZW50cnksICZkb21haW4tPnBsdXJhbCwgJmRvbWFpbi0+bnBsdXJhbHMpOwogfQorCisKKyNpZmRlZiBfTElCQwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF91bmxvYWRfZG9tYWluIChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluKQoreworICBpZiAoZG9tYWluLT5wbHVyYWwgIT0gJl9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwpCisgICAgX19nZXR0ZXh0X2ZyZWVfZXhwIChkb21haW4tPnBsdXJhbCk7CisKKyAgX25sX2ZyZWVfZG9tYWluX2NvbnYgKGRvbWFpbik7CisKKyAgaWYgKGRvbWFpbi0+bWFsbG9jZWQpCisgICAgZnJlZSAoZG9tYWluLT5tYWxsb2NlZCk7CisKKyMgaWZkZWYgX1BPU0lYX01BUFBFRF9GSUxFUworICBpZiAoZG9tYWluLT51c2VfbW1hcCkKKyAgICBtdW5tYXAgKChjYWRkcl90KSBkb21haW4tPmRhdGEsIGRvbWFpbi0+bW1hcF9zaXplKTsKKyAgZWxzZQorIyBlbmRpZgkvKiBfUE9TSVhfTUFQUEVEX0ZJTEVTICovCisgICAgZnJlZSAoKHZvaWQgKikgZG9tYWluLT5kYXRhKTsKKworICBmcmVlIChkb21haW4pOworfQorI2VuZGlmCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2NhbGNoYXJzZXQuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2xvY2FsY2hhcnNldC5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNDc4NzI5MzkyIC0wNDAwCkBAIC0wLDAgKzEsMzk4IEBACisvKiBEZXRlcm1pbmUgYSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nLgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworLyogU3BlY2lmaWNhdGlvbi4gICovCisjaW5jbHVkZSAibG9jYWxjaGFyc2V0LmgiCisKKyNpZiBIQVZFX1NURERFRl9ICisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmIEhBVkVfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZiBIQVZFX1NURExJQl9ICisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXworIyB1bmRlZiBXSU4zMiAgIC8qIGF2b2lkIHdhcm5pbmcgb24gbWluZ3czMiAqLworIyBkZWZpbmUgV0lOMzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX0VNWF9fCisvKiBBc3N1bWUgRU1YIHByb2dyYW0gcnVucyBvbiBPUy8yLCBldmVuIGlmIGNvbXBpbGVkIHVuZGVyIERPUy4gICovCisjIGRlZmluZSBPUzIKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgV0lOMzIKKyMgaWYgSEFWRV9MQU5HSU5GT19DT0RFU0VUCisjICBpbmNsdWRlIDxsYW5naW5mby5oPgorIyBlbHNlCisjICBpZiBIQVZFX1NFVExPQ0FMRQorIyAgIGluY2x1ZGUgPGxvY2FsZS5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbGlmIGRlZmluZWQgV0lOMzIKKyMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisjaWYgZGVmaW5lZCBPUzIKKyMgZGVmaW5lIElOQ0xfRE9TCisjIGluY2x1ZGUgPG9zMi5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKyMgaW5jbHVkZSAicmVsb2NhdGFibGUuaCIKKyNlbHNlCisjIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKKyNlbmRpZgorCisjaWZuZGVmIERJUkVDVE9SWV9TRVBBUkFUT1IKKyMgZGVmaW5lIERJUkVDVE9SWV9TRVBBUkFUT1IgJy8nCisjZW5kaWYKKworI2lmbmRlZiBJU1NMQVNICisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gRElSRUNUT1JZX1NFUEFSQVRPUikKKyNlbmRpZgorCisjaWYgSEFWRV9ERUNMX0dFVENfVU5MT0NLRUQKKyMgdW5kZWYgZ2V0YworIyBkZWZpbmUgZ2V0YyBnZXRjX3VubG9ja2VkCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBzdGF0aWMgdmFyaWFibGUgaXMgZGVjbGFyZWQgJ3ZvbGF0aWxlJyB0byBhdm9pZCBhCisgICBwb3NzaWJsZSBtdWx0aXRocmVhZCBwcm9ibGVtIGluIHRoZSBmdW5jdGlvbiBnZXRfY2hhcnNldF9hbGlhc2VzLiBJZiB3ZQorICAgYXJlIHJ1bm5pbmcgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudCwgYW5kIGlmIHR3byB0aHJlYWRzIGluaXRpYWxpemUKKyAgICdjaGFyc2V0X2FsaWFzZXMnIHNpbXVsdGFuZW91c2x5LCBib3RoIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSB2YWx1ZSwKKyAgIGFuZCBldmVyeXRoaW5nIHdpbGwgYmUgb2sgaWYgdGhlIHR3byBhc3NpZ25tZW50cyB0byAnY2hhcnNldF9hbGlhc2VzJworICAgYXJlIGF0b21pYy4gQnV0IEkgZG9uJ3Qga25vdyB3aGF0IHdpbGwgaGFwcGVuIGlmIHRoZSB0d28gYXNzaWdubWVudHMgbWl4LiAgKi8KKyNpZiBfX1NURENfXyAhPSAxCisjIGRlZmluZSB2b2xhdGlsZSAvKiBlbXB0eSAqLworI2VuZGlmCisvKiBQb2ludGVyIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCisgICByZWFkLCBlbHNlIE5VTEwuICBJdHMgZm9ybWF0IGlzOgorICAgQUxJQVNfMSAnXDAnIENBTk9OSUNBTF8xICdcMCcgLi4uIEFMSUFTX24gJ1wwJyBDQU5PTklDQUxfbiAnXDAnICdcMCcgICovCitzdGF0aWMgY29uc3QgY2hhciAqIHZvbGF0aWxlIGNoYXJzZXRfYWxpYXNlczsKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29udGVudHMgb2YgdGhlIGNoYXJzZXQuYWxpYXMgZmlsZS4gICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfY2hhcnNldF9hbGlhc2VzICgpCit7CisgIGNvbnN0IGNoYXIgKmNwOworCisgIGNwID0gY2hhcnNldF9hbGlhc2VzOworICBpZiAoY3AgPT0gTlVMTCkKKyAgICB7CisjaWYgIShkZWZpbmVkIFZNUyB8fCBkZWZpbmVkIFdJTjMyKQorICAgICAgRklMRSAqZnA7CisgICAgICBjb25zdCBjaGFyICpkaXIgPSByZWxvY2F0ZSAoTElCRElSKTsKKyAgICAgIGNvbnN0IGNoYXIgKmJhc2UgPSAiY2hhcnNldC5hbGlhcyI7CisgICAgICBjaGFyICpmaWxlX25hbWU7CisKKyAgICAgIC8qIENvbmNhdGVuYXRlIGRpciBhbmQgYmFzZSBpbnRvIGZyZXNobHkgYWxsb2NhdGVkIGZpbGVfbmFtZS4gICovCisgICAgICB7CisJc2l6ZV90IGRpcl9sZW4gPSBzdHJsZW4gKGRpcik7CisJc2l6ZV90IGJhc2VfbGVuID0gc3RybGVuIChiYXNlKTsKKwlpbnQgYWRkX3NsYXNoID0gKGRpcl9sZW4gPiAwICYmICFJU1NMQVNIIChkaXJbZGlyX2xlbiAtIDFdKSk7CisJZmlsZV9uYW1lID0gKGNoYXIgKikgbWFsbG9jIChkaXJfbGVuICsgYWRkX3NsYXNoICsgYmFzZV9sZW4gKyAxKTsKKwlpZiAoZmlsZV9uYW1lICE9IE5VTEwpCisJICB7CisJICAgIG1lbWNweSAoZmlsZV9uYW1lLCBkaXIsIGRpcl9sZW4pOworCSAgICBpZiAoYWRkX3NsYXNoKQorCSAgICAgIGZpbGVfbmFtZVtkaXJfbGVuXSA9IERJUkVDVE9SWV9TRVBBUkFUT1I7CisJICAgIG1lbWNweSAoZmlsZV9uYW1lICsgZGlyX2xlbiArIGFkZF9zbGFzaCwgYmFzZSwgYmFzZV9sZW4gKyAxKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMIHx8IChmcCA9IGZvcGVuIChmaWxlX25hbWUsICJyIikpID09IE5VTEwpCisJLyogT3V0IG9mIG1lbW9yeSBvciBmaWxlIG5vdCBmb3VuZCwgdHJlYXQgaXQgYXMgZW1wdHkuICAqLworCWNwID0gIiI7CisgICAgICBlbHNlCisJeworCSAgLyogUGFyc2UgdGhlIGZpbGUncyBjb250ZW50cy4gICovCisJICBpbnQgYzsKKwkgIGNoYXIgYnVmMVs1MCsxXTsKKwkgIGNoYXIgYnVmMls1MCsxXTsKKwkgIGNoYXIgKnJlc19wdHIgPSBOVUxMOworCSAgc2l6ZV90IHJlc19zaXplID0gMDsKKwkgIHNpemVfdCBsMSwgbDI7CisKKwkgIGZvciAoOzspCisJICAgIHsKKwkgICAgICBjID0gZ2V0YyAoZnApOworCSAgICAgIGlmIChjID09IEVPRikKKwkJYnJlYWs7CisJICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICcgJyB8fCBjID09ICdcdCcpCisJCWNvbnRpbnVlOworCSAgICAgIGlmIChjID09ICcjJykKKwkJeworCQkgIC8qIFNraXAgY29tbWVudCwgdG8gZW5kIG9mIGxpbmUuICAqLworCQkgIGRvCisJCSAgICBjID0gZ2V0YyAoZnApOworCQkgIHdoaWxlICghKGMgPT0gRU9GIHx8IGMgPT0gJ1xuJykpOworCQkgIGlmIChjID09IEVPRikKKwkJICAgIGJyZWFrOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgdW5nZXRjIChjLCBmcCk7CisJICAgICAgaWYgKGZzY2FuZiAoZnAsICIlNTBzICU1MHMiLCBidWYxLCBidWYyKSA8IDIpCisJCWJyZWFrOworCSAgICAgIGwxID0gc3RybGVuIChidWYxKTsKKwkgICAgICBsMiA9IHN0cmxlbiAoYnVmMik7CisJICAgICAgaWYgKHJlc19zaXplID09IDApCisJCXsKKwkJICByZXNfc2l6ZSA9IGwxICsgMSArIGwyICsgMTsKKwkJICByZXNfcHRyID0gKGNoYXIgKikgbWFsbG9jIChyZXNfc2l6ZSArIDEpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgcmVzX3NpemUgKz0gbDEgKyAxICsgbDIgKyAxOworCQkgIHJlc19wdHIgPSAoY2hhciAqKSByZWFsbG9jIChyZXNfcHRyLCByZXNfc2l6ZSArIDEpOworCQl9CisJICAgICAgaWYgKHJlc19wdHIgPT0gTlVMTCkKKwkJeworCQkgIC8qIE91dCBvZiBtZW1vcnkuICovCisJCSAgcmVzX3NpemUgPSAwOworCQkgIGJyZWFrOworCQl9CisJICAgICAgc3RyY3B5IChyZXNfcHRyICsgcmVzX3NpemUgLSAobDIgKyAxKSAtIChsMSArIDEpLCBidWYxKTsKKwkgICAgICBzdHJjcHkgKHJlc19wdHIgKyByZXNfc2l6ZSAtIChsMiArIDEpLCBidWYyKTsKKwkgICAgfQorCSAgZmNsb3NlIChmcCk7CisJICBpZiAocmVzX3NpemUgPT0gMCkKKwkgICAgY3AgPSAiIjsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgICoocmVzX3B0ciArIHJlc19zaXplKSA9ICdcMCc7CisJICAgICAgY3AgPSByZXNfcHRyOworCSAgICB9CisJfQorCisgICAgICBpZiAoZmlsZV9uYW1lICE9IE5VTEwpCisJZnJlZSAoZmlsZV9uYW1lKTsKKworI2Vsc2UKKworIyBpZiBkZWZpbmVkIFZNUworICAgICAgLyogVG8gYXZvaWQgdGhlIHRyb3VibGVzIG9mIGFuIGV4dHJhIGZpbGUgY2hhcnNldC5hbGlhc192bXMgaW4gdGhlCisJIHNvdXJjZXMgb2YgbWFueSBHTlUgcGFja2FnZXMsIHNpbXBseSBpbmxpbmUgdGhlIGFsaWFzZXMgaGVyZS4gICovCisgICAgICAvKiBUaGUgbGlzdCBvZiBlbmNvZGluZ3MgaXMgdGFrZW4gZnJvbSB0aGUgT3BlblZNUyA3LjMtMSBkb2N1bWVudGF0aW9uCisJICJDb21wYXEgQyBSdW4tVGltZSBMaWJyYXJ5IFJlZmVyZW5jZSBNYW51YWwgZm9yIE9wZW5WTVMgc3lzdGVtcyIKKwkgc2VjdGlvbiAxMC43ICJIYW5kbGluZyBEaWZmZXJlbnQgQ2hhcmFjdGVyIFNldHMiLiAgKi8KKyAgICAgIGNwID0gIklTTzg4NTktMSIgIlwwIiAiSVNPLTg4NTktMSIgIlwwIgorCSAgICJJU084ODU5LTIiICJcMCIgIklTTy04ODU5LTIiICJcMCIKKwkgICAiSVNPODg1OS01IiAiXDAiICJJU08tODg1OS01IiAiXDAiCisJICAgIklTTzg4NTktNyIgIlwwIiAiSVNPLTg4NTktNyIgIlwwIgorCSAgICJJU084ODU5LTgiICJcMCIgIklTTy04ODU5LTgiICJcMCIKKwkgICAiSVNPODg1OS05IiAiXDAiICJJU08tODg1OS05IiAiXDAiCisJICAgLyogSmFwYW5lc2UgKi8KKwkgICAiZXVjSlAiICJcMCIgIkVVQy1KUCIgIlwwIgorCSAgICJTSklTIiAiXDAiICJTSElGVF9KSVMiICJcMCIKKwkgICAiREVDS0FOSkkiICJcMCIgIkRFQy1LQU5KSSIgIlwwIgorCSAgICJTREVDS0FOSkkiICJcMCIgIkVVQy1KUCIgIlwwIgorCSAgIC8qIENoaW5lc2UgKi8KKwkgICAiZXVjVFciICJcMCIgIkVVQy1UVyIgIlwwIgorCSAgICJERUNIQU5ZVSIgIlwwIiAiREVDLUhBTllVIiAiXDAiCisJICAgIkRFQ0hBTlpJIiAiXDAiICJHQjIzMTIiICJcMCIKKwkgICAvKiBLb3JlYW4gKi8KKwkgICAiREVDS09SRUFOIiAiXDAiICJFVUMtS1IiICJcMCI7CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBXSU4zMgorICAgICAgLyogVG8gYXZvaWQgdGhlIHRyb3VibGVzIG9mIGluc3RhbGxpbmcgYSBzZXBhcmF0ZSBmaWxlIGluIHRoZSBzYW1lCisJIGRpcmVjdG9yeSBhcyB0aGUgRExMIGFuZCBvZiByZXRyaWV2aW5nIHRoZSBETEwncyBkaXJlY3RvcnkgYXQKKwkgcnVudGltZSwgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KKworICAgICAgY3AgPSAiQ1A5MzYiICJcMCIgIkdCSyIgIlwwIgorCSAgICJDUDEzNjEiICJcMCIgIkpPSEFCIiAiXDAiCisJICAgIkNQMjAxMjciICJcMCIgIkFTQ0lJIiAiXDAiCisJICAgIkNQMjA4NjYiICJcMCIgIktPSTgtUiIgIlwwIgorCSAgICJDUDIxODY2IiAiXDAiICJLT0k4LVJVIiAiXDAiCisJICAgIkNQMjg1OTEiICJcMCIgIklTTy04ODU5LTEiICJcMCIKKwkgICAiQ1AyODU5MiIgIlwwIiAiSVNPLTg4NTktMiIgIlwwIgorCSAgICJDUDI4NTkzIiAiXDAiICJJU08tODg1OS0zIiAiXDAiCisJICAgIkNQMjg1OTQiICJcMCIgIklTTy04ODU5LTQiICJcMCIKKwkgICAiQ1AyODU5NSIgIlwwIiAiSVNPLTg4NTktNSIgIlwwIgorCSAgICJDUDI4NTk2IiAiXDAiICJJU08tODg1OS02IiAiXDAiCisJICAgIkNQMjg1OTciICJcMCIgIklTTy04ODU5LTciICJcMCIKKwkgICAiQ1AyODU5OCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgorCSAgICJDUDI4NTk5IiAiXDAiICJJU08tODg1OS05IiAiXDAiCisJICAgIkNQMjg2MDUiICJcMCIgIklTTy04ODU5LTE1IiAiXDAiOworIyBlbmRpZgorI2VuZGlmCisKKyAgICAgIGNoYXJzZXRfYWxpYXNlcyA9IGNwOworICAgIH0KKworICByZXR1cm4gY3A7Cit9CisKKy8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCBjYW5vbmljYWxpemUgaXQKKyAgIGludG8gb25lIG9mIHRoZSBjYW5vbmljYWwgbmFtZXMgbGlzdGVkIGluIGNvbmZpZy5jaGFyc2V0LgorICAgVGhlIHJlc3VsdCBtdXN0IG5vdCBiZSBmcmVlZDsgaXQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuCisgICBJZiB0aGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSByZXN1bHQgaXMgYSBub24tY2Fub25pY2FsCisgICBuYW1lLiAgKi8KKworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZW5kaWYKK2NvbnN0IGNoYXIgKgorbG9jYWxlX2NoYXJzZXQgKCkKK3sKKyAgY29uc3QgY2hhciAqY29kZXNldDsKKyAgY29uc3QgY2hhciAqYWxpYXNlczsKKworI2lmICEoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIE9TMikKKworIyBpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKKworICAvKiBNb3N0IHN5c3RlbXMgc3VwcG9ydCBubF9sYW5naW5mbyAoQ09ERVNFVCkgbm93YWRheXMuICAqLworICBjb2Rlc2V0ID0gbmxfbGFuZ2luZm8gKENPREVTRVQpOworCisjIGVsc2UKKworICAvKiBPbiBvbGQgc3lzdGVtcyB3aGljaCBsYWNrIGl0LCB1c2Ugc2V0bG9jYWxlIG9yIGdldGVudi4gICovCisgIGNvbnN0IGNoYXIgKmxvY2FsZSA9IE5VTEw7CisKKyAgLyogQnV0IG1vc3Qgb2xkIHN5c3RlbXMgZG9uJ3QgaGF2ZSBhIGNvbXBsZXRlIHNldCBvZiBsb2NhbGVzLiAgU29tZQorICAgICAobGlrZSBTdW5PUyA0IG9yIERKR1BQKSBoYXZlIG9ubHkgdGhlIEMgbG9jYWxlLiAgVGhlcmVmb3JlIHdlIGRvbid0CisgICAgIHVzZSBzZXRsb2NhbGUgaGVyZTsgaXQgd291bGQgcmV0dXJuICJDIiB3aGVuIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKKyAgICAgbG9jYWxlIG5hbWUgdGhlIHVzZXIgaGFzIHNldC4gICovCisjICBpZiBIQVZFX1NFVExPQ0FMRSAmJiAwCisgIGxvY2FsZSA9IHNldGxvY2FsZSAoTENfQ1RZUEUsIE5VTEwpOworIyAgZW5kaWYKKyAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOworICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorCXsKKwkgIGxvY2FsZSA9IGdldGVudiAoIkxDX0NUWVBFIik7CisJICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisJICAgIGxvY2FsZSA9IGdldGVudiAoIkxBTkciKTsKKwl9CisgICAgfQorCisgIC8qIE9uIHNvbWUgb2xkIHN5c3RlbXMsIG9uZSB1c2VkIHRvIHNldCBsb2NhbGUgPSAiaXNvODg1OV8xIi4gT24gb3RoZXJzLAorICAgICB5b3Ugc2V0IGl0IHRvICJsYW5ndWFnZV9DT1VOVFJZLmNoYXJzZXQiLiBJbiBhbnkgY2FzZSwgd2UgcmVzb2x2ZSBpdAorICAgICB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLworICBjb2Rlc2V0ID0gbG9jYWxlOworCisjIGVuZGlmCisKKyNlbGlmIGRlZmluZWQgV0lOMzIKKworICBzdGF0aWMgY2hhciBidWZbMiArIDEwICsgMV07CisKKyAgLyogV29lMzIgaGFzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsb2NhbGUncyBjb2RlcGFnZSBhcyBhIG51bWJlci4gICovCisgIHNwcmludGYgKGJ1ZiwgIkNQJXUiLCBHZXRBQ1AgKCkpOworICBjb2Rlc2V0ID0gYnVmOworCisjZWxpZiBkZWZpbmVkIE9TMgorCisgIGNvbnN0IGNoYXIgKmxvY2FsZTsKKyAgc3RhdGljIGNoYXIgYnVmWzIgKyAxMCArIDFdOworICBVTE9ORyBjcFszXTsKKyAgVUxPTkcgY3BsZW47CisKKyAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgY29kZXNldCwgYXMgc2V0IGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtLAorICAgICB3aXRoIHN0YW5kYXJkIGxhbmd1YWdlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCisgIGxvY2FsZSA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisgICAgeworICAgICAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQ1RZUEUiKTsKKyAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKKwlsb2NhbGUgPSBnZXRlbnYgKCJMQU5HIik7CisgICAgfQorICBpZiAobG9jYWxlICE9IE5VTEwgJiYgbG9jYWxlWzBdICE9ICdcMCcpCisgICAgeworICAgICAgLyogSWYgdGhlIGxvY2FsZSBuYW1lIGNvbnRhaW5zIGFuIGVuY29kaW5nIGFmdGVyIHRoZSBkb3QsIHJldHVybiBpdC4gICovCisgICAgICBjb25zdCBjaGFyICpkb3QgPSBzdHJjaHIgKGxvY2FsZSwgJy4nKTsKKworICAgICAgaWYgKGRvdCAhPSBOVUxMKQorCXsKKwkgIGNvbnN0IGNoYXIgKm1vZGlmaWVyOworCisJICBkb3QrKzsKKwkgIC8qIExvb2sgZm9yIHRoZSBwb3NzaWJsZSBALi4uIHRyYWlsZXIgYW5kIHJlbW92ZSBpdCwgaWYgYW55LiAgKi8KKwkgIG1vZGlmaWVyID0gc3RyY2hyIChkb3QsICdAJyk7CisJICBpZiAobW9kaWZpZXIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIGRvdDsKKwkgIGlmIChtb2RpZmllciAtIGRvdCA8IHNpemVvZiAoYnVmKSkKKwkgICAgeworCSAgICAgIG1lbWNweSAoYnVmLCBkb3QsIG1vZGlmaWVyIC0gZG90KTsKKwkgICAgICBidWYgW21vZGlmaWVyIC0gZG90XSA9ICdcMCc7CisJICAgICAgcmV0dXJuIGJ1ZjsKKwkgICAgfQorCX0KKworICAgICAgLyogUmVzb2x2ZSB0aHJvdWdoIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUuICAqLworICAgICAgY29kZXNldCA9IGxvY2FsZTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBPUy8yIGhhcyBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbG9jYWxlJ3MgY29kZXBhZ2UgYXMgYSBudW1iZXIuICAqLworICAgICAgaWYgKERvc1F1ZXJ5Q3AgKHNpemVvZiAoY3ApLCBjcCwgJmNwbGVuKSkKKwljb2Rlc2V0ID0gIiI7CisgICAgICBlbHNlCisJeworCSAgc3ByaW50ZiAoYnVmLCAiQ1AldSIsIGNwWzBdKTsKKwkgIGNvZGVzZXQgPSBidWY7CisJfQorICAgIH0KKworI2VuZGlmCisKKyAgaWYgKGNvZGVzZXQgPT0gTlVMTCkKKyAgICAvKiBUaGUgY2Fub25pY2FsIG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQuICAqLworICAgIGNvZGVzZXQgPSAiIjsKKworICAvKiBSZXNvbHZlIGFsaWFzLiAqLworICBmb3IgKGFsaWFzZXMgPSBnZXRfY2hhcnNldF9hbGlhc2VzICgpOworICAgICAgICphbGlhc2VzICE9ICdcMCc7CisgICAgICAgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSwgYWxpYXNlcyArPSBzdHJsZW4gKGFsaWFzZXMpICsgMSkKKyAgICBpZiAoc3RyY21wIChjb2Rlc2V0LCBhbGlhc2VzKSA9PSAwCisJfHwgKGFsaWFzZXNbMF0gPT0gJyonICYmIGFsaWFzZXNbMV0gPT0gJ1wwJykpCisgICAgICB7CisJY29kZXNldCA9IGFsaWFzZXMgKyBzdHJsZW4gKGFsaWFzZXMpICsgMTsKKwlicmVhazsKKyAgICAgIH0KKworICAvKiBEb24ndCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLiAgR05VIGxpYmMgYW5kIEdOVSBsaWJpY29udiBpbnRlcnByZXQKKyAgICAgdGhlIGVtcHR5IHN0cmluZyBhcyBkZW5vdGluZyAidGhlIGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZyIsCisgICAgIHRodXMgR05VIGxpYmljb252IHdvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhIHNlY29uZCB0aW1lLiAgKi8KKyAgaWYgKGNvZGVzZXRbMF0gPT0gJ1wwJykKKyAgICBjb2Rlc2V0ID0gIkFTQ0lJIjsKKworICByZXR1cm4gY29kZXNldDsKK30KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xvY2FsY2hhcnNldC5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvbG9jYWxjaGFyc2V0LmgJMjAwNC0wOS0xMiAxNDo0MDozNC40ODM3Mjg2MzIgLTA0MDAKQEAgLTAsMCArMSw0MiBAQAorLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDSEFSU0VUIExpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9MT0NBTENIQVJTRVRfSAorI2RlZmluZSBfTE9DQUxDSEFSU0VUX0gKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAorICAgaW50byBvbmUgb2YgdGhlIGNhbm9uaWNhbCBuYW1lcyBsaXN0ZWQgaW4gY29uZmlnLmNoYXJzZXQuCisgICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4KKyAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKKyAgIG5hbWUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiBsb2NhbGVfY2hhcnNldCAodm9pZCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX0xPQ0FMQ0hBUlNFVF9IICovCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2NhbGUuYWxpYXMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2NhbGUuYWxpYXMJMjAwNC0wOS0xMiAxNDo0MDozNC40OTk3MjYyMDAgLTA0MDAKQEAgLTAsMCArMSw3OCBAQAorIyBMb2NhbGUgbmFtZSBhbGlhcyBkYXRhIGJhc2UuCisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDAxLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorIyBVU0EuCisKKyMgVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgb2YKKyMgdGhlIFggV2luZG93IFN5c3RlbSwgd2hpY2ggbm9ybWFsbHkgY2FuIGJlIGZvdW5kIGluCisjCS91c3IvbGliL1gxMS9sb2NhbGUvbG9jYWxlLmFsaWFzCisjIEEgc2luZ2xlIGxpbmUgY29udGFpbnMgdHdvIGZpZWxkczogYW4gYWxpYXMgYW5kIGEgc3Vic3RpdHV0aW9uIHZhbHVlLgorIyBBbGwgZW50cmllcyBhcmUgY2FzZSBpbmRlcGVuZGVudC4KKworIyBOb3RlOiBUaGlzIGZpbGUgaXMgZmFyIGZyb20gYmVpbmcgY29tcGxldGUuICBJZiB5b3UgaGF2ZSBhIHZhbHVlIGZvcgorIyB5b3VyIG93biBzaXRlIHdoaWNoIHlvdSB0aGluayBtaWdodCBiZSB1c2VmdWwgZm9yIG90aGVycyB0b28sIHNoYXJlCisjIGl0IHdpdGggdGhlIHJlc3Qgb2YgdXMuICBTZW5kIGl0IHVzaW5nIHRoZSBgZ2xpYmNidWcnIHNjcmlwdCB0bworIyBidWdzQGdudS5vcmcuCisKKyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOiAKKworYm9rbWFsCQluYl9OTy5JU08tODg1OS0xCitib2tt5WwJCW5iX05PLklTTy04ODU5LTEKK2NhdGFsYW4JCWNhX0VTLklTTy04ODU5LTEKK2Nyb2F0aWFuCWhyX0hSLklTTy04ODU5LTIKK2N6ZWNoCQljc19DWi5JU08tODg1OS0yCitkYW5pc2ggICAgICAgICAgZGFfREsuSVNPLTg4NTktMQorZGFuc2sJCWRhX0RLLklTTy04ODU5LTEKK2RldXRzY2gJCWRlX0RFLklTTy04ODU5LTEKK2R1dGNoCQlubF9OTC5JU08tODg1OS0xCitlZXN0aQkJZXRfRUUuSVNPLTg4NTktMQorZXN0b25pYW4JZXRfRUUuSVNPLTg4NTktMQorZmlubmlzaCAgICAgICAgIGZpX0ZJLklTTy04ODU5LTEKK2ZyYW7nYWlzCWZyX0ZSLklTTy04ODU5LTEKK2ZyZW5jaAkJZnJfRlIuSVNPLTg4NTktMQorZ2FsZWdvCQlnbF9FUy5JU08tODg1OS0xCitnYWxpY2lhbglnbF9FUy5JU08tODg1OS0xCitnZXJtYW4JCWRlX0RFLklTTy04ODU5LTEKK2dyZWVrICAgICAgICAgICBlbF9HUi5JU08tODg1OS03CitoZWJyZXcgICAgICAgICAgaGVfSUwuSVNPLTg4NTktOAoraHJ2YXRza2kJaHJfSFIuSVNPLTg4NTktMgoraHVuZ2FyaWFuICAgICAgIGh1X0hVLklTTy04ODU5LTIKK2ljZWxhbmRpYyAgICAgICBpc19JUy5JU08tODg1OS0xCitpdGFsaWFuICAgICAgICAgaXRfSVQuSVNPLTg4NTktMQoramFwYW5lc2UJamFfSlAuZXVjSlAKK2phcGFuZXNlLmV1YwlqYV9KUC5ldWNKUAoramFfSlAJCWphX0pQLmV1Y0pQCitqYV9KUC51amlzCWphX0pQLmV1Y0pQCitqYXBhbmVzZS5zamlzCWphX0pQLlNKSVMKK2tvcmVhbgkJa29fS1IuZXVjS1IKK2tvcmVhbi5ldWMgCWtvX0tSLmV1Y0tSCitrb19LUgkJa29fS1IuZXVjS1IKK2xpdGh1YW5pYW4gICAgICBsdF9MVC5JU08tODg1OS0xMworbm9fTk8JCW5iX05PLklTTy04ODU5LTEKK25vX05PLklTTy04ODU5LTEgbmJfTk8uSVNPLTg4NTktMQorbm9yd2VnaWFuICAgICAgIG5iX05PLklTTy04ODU5LTEKK255bm9yc2sJCW5uX05PLklTTy04ODU5LTEKK3BvbGlzaCAgICAgICAgICBwbF9QTC5JU08tODg1OS0yCitwb3J0dWd1ZXNlICAgICAgcHRfUFQuSVNPLTg4NTktMQorcm9tYW5pYW4gICAgICAgIHJvX1JPLklTTy04ODU5LTIKK3J1c3NpYW4gICAgICAgICBydV9SVS5JU08tODg1OS01CitzbG92YWsgICAgICAgICAgc2tfU0suSVNPLTg4NTktMgorc2xvdmVuZSAgICAgICAgIHNsX1NJLklTTy04ODU5LTIKK3Nsb3ZlbmlhbiAgICAgICBzbF9TSS5JU08tODg1OS0yCitzcGFuaXNoICAgICAgICAgZXNfRVMuSVNPLTg4NTktMQorc3dlZGlzaCAgICAgICAgIHN2X1NFLklTTy04ODU5LTEKK3RoYWkJCXRoX1RILlRJUy02MjAKK3R1cmtpc2ggICAgICAgICB0cl9UUi5JU08tODg1OS05Ci0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2NhbGVhbGlhcy5jCTE5OTgtMDQtMjYgMDk6MjI6MzcuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvbG9jYWxlYWxpYXMuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjUwNTcyNTI4OCAtMDQwMApAQCAtMSwyMCArMSwyNyBAQAotLyogSGFuZGxlIGFsaWFzZXMgZm9yIGxvY2FsZSBuYW1lcwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisvKiBIYW5kbGUgYWxpYXNlcyBmb3IgbG9jYWxlIG5hbWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogICAgYW55IGxhdGVyIHZlcnNpb24uCiAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBtZW1wY3B5KCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKKyNlbmRpZgogCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogIyBpbmNsdWRlIDxjb25maWcuaD4KQEAgLTIyLDU2ICsyOSw0NSBAQAogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRpby5oPgorI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX19fRlNFVExPQ0tJTkcKKyMgaW5jbHVkZSA8c3RkaW9fZXh0Lmg+CisjZW5kaWYKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2lmZGVmIF9fR05VQ19fCisjIHVuZGVmIGFsbG9jYQogIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKICMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKICNlbHNlCi0jIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCiAjIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQorIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KICMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCiBjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCiAjICAgZW5kaWYKICMgIGVuZGlmCiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotY2hhciAqZ2V0ZW52ICgpOwotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgX0dOVV9TT1VSQ0UKLSMgIGRlZmluZSBfR05VX1NPVVJDRQkxCi0jIGVuZGlmCi0jIGluY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdldHRleHRQLmgiCisKKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKyMgaW5jbHVkZSAicmVsb2NhdGFibGUuaCIKICNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCisjIGRlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQogI2VuZGlmCiAKLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQogLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwogCiAjaWZkZWYgX0xJQkMKQEAgLTc5LDQzICs3NSw0OSBAQAogICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAogICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwogIyBkZWZpbmUgc3RyY2FzZWNtcCBfX3N0cmNhc2VjbXAKKworIyBpZm5kZWYgbWVtcGNweQorIyAgZGVmaW5lIG1lbXBjcHkgX19tZW1wY3B5CisjIGVuZGlmCisjIGRlZmluZSBIQVZFX01FTVBDUFkJMQorIyBkZWZpbmUgSEFWRV9fX0ZTRVRMT0NLSU5HCTEKKworLyogV2UgbmVlZCBsb2NraW5nIGhlcmUgc2luY2Ugd2UgY2FuIGJlIGNhbGxlZCBmcm9tIGRpZmZlcmVudCBwbGFjZXMuICAqLworIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgorCitfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jayk7CisjZW5kaWYKKworI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgorIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24KICNlbmRpZgogCisvKiBTb21lIG9wdGltaXphdGlvbnMgZm9yIGdsaWJjLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRkVPRihmcCkJCWZlb2ZfdW5sb2NrZWQgKGZwKQorIyBkZWZpbmUgRkdFVFMoYnVmLCBuLCBmcCkJZmdldHNfdW5sb2NrZWQgKGJ1ZiwgbiwgZnApCisjZWxzZQorIyBkZWZpbmUgRkVPRihmcCkJCWZlb2YgKGZwKQorIyBkZWZpbmUgRkdFVFMoYnVmLCBuLCBmcCkJZmdldHMgKGJ1ZiwgbiwgZnApCisjZW5kaWYKIAotLyogRm9yIHRob3NlIGxvb3Npbmcgc3lzdGVtcyB3aGljaCBkb24ndCBoYXZlIGBhbGxvY2EnIHdlIGhhdmUgdG8gYWRkCisvKiBGb3IgdGhvc2UgbG9zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAogICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KICNpZmRlZiBIQVZFX0FMTE9DQQotLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCi0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLworIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLwogI2Vsc2UKLXN0cnVjdCBibG9ja19saXN0Ci17Ci0gIHZvaWQgKmFkZHJlc3M7Ci0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotfTsKLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KKyMgZGVmaW5lIGFsbG9jYShuKSBtYWxsb2MgKG4pCisjIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9MSUJDX1JFRU5UUkFOVCB8fCBIQVZFX0RFQ0xfRkdFVFNfVU5MT0NLRUQKKyMgdW5kZWYgZmdldHMKKyMgZGVmaW5lIGZnZXRzKGJ1ZiwgbGVuLCBzKSBmZ2V0c191bmxvY2tlZCAoYnVmLCBsZW4sIHMpCisjZW5kaWYKKyNpZiBkZWZpbmVkIF9MSUJDX1JFRU5UUkFOVCB8fCBIQVZFX0RFQ0xfRkVPRl9VTkxPQ0tFRAorIyB1bmRlZiBmZW9mCisjIGRlZmluZSBmZW9mKHMpIGZlb2ZfdW5sb2NrZWQgKHMpCisjZW5kaWYKIAogCiBzdHJ1Y3QgYWxpYXNfbWFwCkBAIC0xMjUsMjYgKzEyNyw0MSBAQAogfTsKIAogCi1zdGF0aWMgc3RydWN0IGFsaWFzX21hcCAqbWFwOwotc3RhdGljIHNpemVfdCBubWFwID0gMDsKLXN0YXRpYyBzaXplX3QgbWF4bWFwID0gMDsKKyNpZm5kZWYgX0xJQkMKKyMgZGVmaW5lIGxpYmNfZnJlZXJlc19wdHIoZGVjbCkgZGVjbAorI2VuZGlmCisKK2xpYmNfZnJlZXJlc19wdHIgKHN0YXRpYyBjaGFyICpzdHJpbmdfc3BhY2UpOworc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfYWN0Oworc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfbWF4OworbGliY19mcmVlcmVzX3B0ciAoc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcCk7CitzdGF0aWMgc2l6ZV90IG5tYXA7CitzdGF0aWMgc2l6ZV90IG1heG1hcDsKIAogCiAvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLwotc3RhdGljIHNpemVfdCByZWFkX2FsaWFzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZm5hbWUsIGludCBmbmFtZV9sZW4pKTsKLXN0YXRpYyB2b2lkIGV4dGVuZF9hbGlhc190YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGFsaWFzX2NvbXBhcmUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpKTsKK3N0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitzdGF0aWMgaW50IGV4dGVuZF9hbGlhc190YWJsZSAodm9pZCk7CitzdGF0aWMgaW50IGFsaWFzX2NvbXBhcmUgKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCisJCQkgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpOwogCiAKIGNvbnN0IGNoYXIgKgotX25sX2V4cGFuZF9hbGlhcyAobmFtZSkKLSAgICBjb25zdCBjaGFyICpuYW1lOworX25sX2V4cGFuZF9hbGlhcyAoY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmxvY2FsZV9hbGlhc19wYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7CisgIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aDsKICAgc3RydWN0IGFsaWFzX21hcCAqcmV0dmFsOworICBjb25zdCBjaGFyICpyZXN1bHQgPSBOVUxMOwogICBzaXplX3QgYWRkZWQ7CiAKKyNpZmRlZiBfTElCQworICBfX2xpYmNfbG9ja19sb2NrIChsb2NrKTsKKyNlbmRpZgorCisgIGlmIChsb2NhbGVfYWxpYXNfcGF0aCA9PSBOVUxMKQorICAgIGxvY2FsZV9hbGlhc19wYXRoID0gTE9DQUxFX0FMSUFTX1BBVEg7CisKICAgZG8KICAgICB7CiAgICAgICBzdHJ1Y3QgYWxpYXNfbWFwIGl0ZW07CkBAIC0xNTQsMTUgKzE3MSwxOCBAQAogICAgICAgaWYgKG5tYXAgPiAwKQogCXJldHZhbCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIGJzZWFyY2ggKCZpdGVtLCBtYXAsIG5tYXAsCiAJCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAotCQkJCQkgICAgICAgKGludCAoKikgUEFSQU1TICgoY29uc3Qgdm9pZCAqLAotCQkJCQkJCQkgY29uc3Qgdm9pZCAqKSkKKwkJCQkJICAgICAgIChpbnQgKCopIChjb25zdCB2b2lkICosCisJCQkJCQkJIGNvbnN0IHZvaWQgKikKIAkJCQkJCSkgYWxpYXNfY29tcGFyZSk7CiAgICAgICBlbHNlCiAJcmV0dmFsID0gTlVMTDsKIAogICAgICAgLyogV2UgcmVhbGx5IGZvdW5kIGFuIGFsaWFzLiAgUmV0dXJuIHRoZSB2YWx1ZS4gICovCiAgICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JcmV0dXJuIHJldHZhbC0+dmFsdWU7CisJeworCSAgcmVzdWx0ID0gcmV0dmFsLT52YWx1ZTsKKwkgIGJyZWFrOworCX0KIAogICAgICAgLyogUGVyaGFwcyB3ZSBjYW4gZmluZCBhbm90aGVyIGFsaWFzIGZpbGUuICAqLwogICAgICAgYWRkZWQgPSAwOwpAQCAtMTcwLDExICsxOTAsMTIgQEAKIAl7CiAJICBjb25zdCBjaGFyICpzdGFydDsKIAotCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdID09ICc6JykKKwkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSA9PSBQQVRIX1NFUEFSQVRPUikKIAkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKIAkgIHN0YXJ0ID0gbG9jYWxlX2FsaWFzX3BhdGg7CiAKLQkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnICYmIGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICc6JykKKwkgIHdoaWxlIChsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnCisJCSAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSBQQVRIX1NFUEFSQVRPUikKIAkgICAgKytsb2NhbGVfYWxpYXNfcGF0aDsKIAogCSAgaWYgKHN0YXJ0IDwgbG9jYWxlX2FsaWFzX3BhdGgpCkBAIC0xODMsNzggKzIwNCw4NyBAQAogICAgIH0KICAgd2hpbGUgKGFkZGVkICE9IDApOwogCi0gIHJldHVybiBOVUxMOworI2lmZGVmIF9MSUJDCisgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisjZW5kaWYKKworICByZXR1cm4gcmVzdWx0OwogfQogCiAKIHN0YXRpYyBzaXplX3QKLXJlYWRfYWxpYXNfZmlsZSAoZm5hbWUsIGZuYW1lX2xlbikKLSAgICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgIGludCBmbmFtZV9sZW47CitpbnRlcm5hbF9mdW5jdGlvbgorcmVhZF9hbGlhc19maWxlIChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZuYW1lX2xlbikKIHsKLSNpZm5kZWYgSEFWRV9BTExPQ0EKLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotI2VuZGlmCiAgIEZJTEUgKmZwOwogICBjaGFyICpmdWxsX2ZuYW1lOwogICBzaXplX3QgYWRkZWQ7CiAgIHN0YXRpYyBjb25zdCBjaGFyIGFsaWFzZmlsZVtdID0gIi9sb2NhbGUuYWxpYXMiOwogCiAgIGZ1bGxfZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGZuYW1lX2xlbiArIHNpemVvZiBhbGlhc2ZpbGUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGZ1bGxfZm5hbWUpOworI2lmZGVmIEhBVkVfTUVNUENQWQorICBtZW1wY3B5IChtZW1wY3B5IChmdWxsX2ZuYW1lLCBmbmFtZSwgZm5hbWVfbGVuKSwKKwkgICBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOworI2Vsc2UKICAgbWVtY3B5IChmdWxsX2ZuYW1lLCBmbmFtZSwgZm5hbWVfbGVuKTsKICAgbWVtY3B5ICgmZnVsbF9mbmFtZVtmbmFtZV9sZW5dLCBhbGlhc2ZpbGUsIHNpemVvZiBhbGlhc2ZpbGUpOworI2VuZGlmCiAKLSAgZnAgPSBmb3BlbiAoZnVsbF9mbmFtZSwgInIiKTsKKyAgZnAgPSBmb3BlbiAocmVsb2NhdGUgKGZ1bGxfZm5hbWUpLCAiciIpOworICBmcmVlYSAoZnVsbF9mbmFtZSk7CiAgIGlmIChmcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gMDsKKworI2lmZGVmIEhBVkVfX19GU0VUTE9DS0lORworICAvKiBObyB0aHJlYWRzIHByZXNlbnQuICAqLworICBfX2ZzZXRsb2NraW5nIChmcCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworI2VuZGlmCiAKICAgYWRkZWQgPSAwOwotICB3aGlsZSAoIWZlb2YgKGZwKSkKKyAgd2hpbGUgKCFGRU9GIChmcCkpCiAgICAgewogICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCiAJIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKIAkgYikgdGhlc2UgZmllbGRzIG11c3QgYmUgdXNhYmxlIGFzIGZpbGUgbmFtZXMgYW5kIHNvIG11c3Qgbm90CiAJICAgIGJlIHRoYXQgbG9uZwotICAgICAgICovCi0gICAgICBjaGFyIGJ1ZltCVUZTSVpdOworCSBXZSBhdm9pZCBhIG11bHRpLWtpbG9ieXRlIGJ1ZmZlciBoZXJlIHNpbmNlIHRoaXMgd291bGQgdXNlIHVwCisJIHN0YWNrIHNwYWNlIHdoaWNoIHdlIG1pZ2h0IG5vdCBoYXZlIGlmIHRoZSBwcm9ncmFtIHJhbiBvdXQgb2YKKwkgbWVtb3J5LiAgKi8KKyAgICAgIGNoYXIgYnVmWzQwMF07CiAgICAgICBjaGFyICphbGlhczsKICAgICAgIGNoYXIgKnZhbHVlOwogICAgICAgY2hhciAqY3A7CiAKLSAgICAgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQorICAgICAgaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQogCS8qIEVPRiByZWFjaGVkLiAgKi8KIAlicmVhazsKIAogICAgICAgY3AgPSBidWY7CiAgICAgICAvKiBJZ25vcmUgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoY3BbMF0pKQorICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCiAJKytjcDsKIAogICAgICAgLyogQSBsZWFkaW5nICcjJyBzaWduYWxzIGEgY29tbWVudCBsaW5lLiAgKi8KICAgICAgIGlmIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcjJykKIAl7CiAJICBhbGlhcyA9IGNwKys7Ci0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoY3BbMF0pKQorCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCiAJICAgICsrY3A7CiAJICAvKiBUZXJtaW5hdGUgYWxpYXMgbmFtZS4gICovCiAJICBpZiAoY3BbMF0gIT0gJ1wwJykKIAkgICAgKmNwKysgPSAnXDAnOwogCiAJICAvKiBOb3cgbG9vayBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFsdWUuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKKwkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQogCSAgICArK2NwOwogCiAJICBpZiAoY3BbMF0gIT0gJ1wwJykKIAkgICAgewotCSAgICAgIGNoYXIgKnRwOwotCSAgICAgIHNpemVfdCBsZW47CisJICAgICAgc2l6ZV90IGFsaWFzX2xlbjsKKwkgICAgICBzaXplX3QgdmFsdWVfbGVuOwogCiAJICAgICAgdmFsdWUgPSBjcCsrOwotCSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCisJICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgIWlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjcFswXSkpCiAJCSsrY3A7CiAJICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KIAkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKQEAgLTI2OSwyOCArMjk5LDQ0IEBACiAJCSpjcCsrID0gJ1wwJzsKIAogCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKLQkJZXh0ZW5kX2FsaWFzX3RhYmxlICgpOwotCi0JICAgICAgLyogV2UgY2Fubm90IGRlcGVuZCBvbiBzdHJkdXAgYXZhaWxhYmxlIGluIHRoZSBsaWJjLiAgU2lnaCEgICovCi0JICAgICAgbGVuID0gc3RybGVuIChhbGlhcykgKyAxOwotCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmICh0cCA9PSBOVUxMKQotCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOworCQlpZiAoX19idWlsdGluX2V4cGVjdCAoZXh0ZW5kX2FsaWFzX3RhYmxlICgpLCAwKSkKIAkJICByZXR1cm4gYWRkZWQ7Ci0JCX0KLQkgICAgICBtZW1jcHkgKHRwLCBhbGlhcywgbGVuKTsKLQkgICAgICBtYXBbbm1hcF0uYWxpYXMgPSB0cDsKIAotCSAgICAgIGxlbiA9IHN0cmxlbiAodmFsdWUpICsgMTsKLQkgICAgICB0cCA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLQkgICAgICBpZiAodHAgPT0gTlVMTCkKKwkgICAgICBhbGlhc19sZW4gPSBzdHJsZW4gKGFsaWFzKSArIDE7CisJICAgICAgdmFsdWVfbGVuID0gc3RybGVuICh2YWx1ZSkgKyAxOworCisJICAgICAgaWYgKHN0cmluZ19zcGFjZV9hY3QgKyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiBzdHJpbmdfc3BhY2VfbWF4KQogCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCQkgIHJldHVybiBhZGRlZDsKKwkJICAvKiBJbmNyZWFzZSBzaXplIG9mIG1lbW9yeSBwb29sLiAgKi8KKwkJICBzaXplX3QgbmV3X3NpemUgPSAoc3RyaW5nX3NwYWNlX21heAorCQkJCSAgICAgKyAoYWxpYXNfbGVuICsgdmFsdWVfbGVuID4gMTAyNAorCQkJCQk/IGFsaWFzX2xlbiArIHZhbHVlX2xlbiA6IDEwMjQpKTsKKwkJICBjaGFyICpuZXdfcG9vbCA9IChjaGFyICopIHJlYWxsb2MgKHN0cmluZ19zcGFjZSwgbmV3X3NpemUpOworCQkgIGlmIChuZXdfcG9vbCA9PSBOVUxMKQorCQkgICAgcmV0dXJuIGFkZGVkOworCisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHN0cmluZ19zcGFjZSAhPSBuZXdfcG9vbCwgMCkpCisJCSAgICB7CisJCSAgICAgIHNpemVfdCBpOworCisJCSAgICAgIGZvciAoaSA9IDA7IGkgPCBubWFwOyBpKyspCisJCQl7CisJCQkgIG1hcFtpXS5hbGlhcyArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKKwkJCSAgbWFwW2ldLnZhbHVlICs9IG5ld19wb29sIC0gc3RyaW5nX3NwYWNlOworCQkJfQorCQkgICAgfQorCisJCSAgc3RyaW5nX3NwYWNlID0gbmV3X3Bvb2w7CisJCSAgc3RyaW5nX3NwYWNlX21heCA9IG5ld19zaXplOwogCQl9Ci0JICAgICAgbWVtY3B5ICh0cCwgdmFsdWUsIGxlbik7Ci0JICAgICAgbWFwW25tYXBdLnZhbHVlID0gdHA7CisKKwkgICAgICBtYXBbbm1hcF0uYWxpYXMgPSBtZW1jcHkgKCZzdHJpbmdfc3BhY2Vbc3RyaW5nX3NwYWNlX2FjdF0sCisJCQkJCWFsaWFzLCBhbGlhc19sZW4pOworCSAgICAgIHN0cmluZ19zcGFjZV9hY3QgKz0gYWxpYXNfbGVuOworCisJICAgICAgbWFwW25tYXBdLnZhbHVlID0gbWVtY3B5ICgmc3RyaW5nX3NwYWNlW3N0cmluZ19zcGFjZV9hY3RdLAorCQkJCQl2YWx1ZSwgdmFsdWVfbGVuKTsKKwkgICAgICBzdHJpbmdfc3BhY2VfYWN0ICs9IHZhbHVlX2xlbjsKIAogCSAgICAgICsrbm1hcDsKIAkgICAgICArK2FkZGVkOwpAQCAtMjk5LDE0ICszNDUsMTEgQEAKIAogICAgICAgLyogUG9zc2libHkgbm90IHRoZSB3aG9sZSBsaW5lIGZpdHMgaW50byB0aGUgYnVmZmVyLiAgSWdub3JlCiAJIHRoZSByZXN0IG9mIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlIChzdHJjaHIgKGNwLCAnXG4nKSA9PSBOVUxMKQotCXsKLQkgIGNwID0gYnVmOwotCSAgaWYgKGZnZXRzIChidWYsIEJVRlNJWiwgZnApID09IE5VTEwpCi0JICAgIC8qIE1ha2Ugc3VyZSB0aGUgaW5uZXIgbG9vcCB3aWxsIGJlIGxlZnQuICBUaGUgb3V0ZXIgbG9vcAotCSAgICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KLQkgICAgKmNwID0gJ1xuJzsKLQl9CisgICAgICB3aGlsZSAoc3RyY2hyIChidWYsICdcbicpID09IE5VTEwpCisJaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQorCSAgLyogTWFrZSBzdXJlIHRoZSBpbm5lciBsb29wIHdpbGwgYmUgbGVmdC4gIFRoZSBvdXRlciBsb29wCisJICAgICB3aWxsIGV4aXQgYXQgdGhlIGBmZW9mJyB0ZXN0LiAgKi8KKwkgIGJyZWFrOwogICAgIH0KIAogICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCkBAIC0zMTUsNDAgKzM1OCwzMyBAQAogCiAgIGlmIChhZGRlZCA+IDApCiAgICAgcXNvcnQgKG1hcCwgbm1hcCwgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLQkgICAoaW50ICgqKSBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpKSBhbGlhc19jb21wYXJlKTsKKwkgICAoaW50ICgqKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSBhbGlhc19jb21wYXJlKTsKIAotICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7CiAgIHJldHVybiBhZGRlZDsKIH0KIAogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogZXh0ZW5kX2FsaWFzX3RhYmxlICgpCiB7CiAgIHNpemVfdCBuZXdfc2l6ZTsKICAgc3RydWN0IGFsaWFzX21hcCAqbmV3X21hcDsKIAogICBuZXdfc2l6ZSA9IG1heG1hcCA9PSAwID8gMTAwIDogMiAqIG1heG1hcDsKLSAgbmV3X21hcCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIG1hbGxvYyAobmV3X3NpemUKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSk7CisgIG5ld19tYXAgPSAoc3RydWN0IGFsaWFzX21hcCAqKSByZWFsbG9jIChtYXAsIChuZXdfc2l6ZQorCQkJCQkJKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKSk7CiAgIGlmIChuZXdfbWFwID09IE5VTEwpCiAgICAgLyogU2ltcGx5IGRvbid0IGV4dGVuZDogd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjb3JlLiAgKi8KLSAgICByZXR1cm47Ci0KLSAgbWVtY3B5IChuZXdfbWFwLCBtYXAsIG5tYXAgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKLQotICBpZiAobWF4bWFwICE9IDApCi0gICAgZnJlZSAobWFwKTsKKyAgICByZXR1cm4gLTE7CiAKICAgbWFwID0gbmV3X21hcDsKICAgbWF4bWFwID0gbmV3X3NpemU7CisgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKLWFsaWFzX2NvbXBhcmUgKG1hcDEsIG1hcDIpCi0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDE7Ci0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDI7CithbGlhc19jb21wYXJlIChjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAxLCBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKQogewogI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkNBU0VDTVAKICAgcmV0dXJuIHN0cmNhc2VjbXAgKG1hcDEtPmFsaWFzLCBtYXAyLT5hbGlhcyk7Ci0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9sb2NhbGVuYW1lLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2NhbGVuYW1lLmMJMjAwNC0wOS0xMiAxNDo0MDozNC41MTA3MjQ1MjggLTA0MDAKQEAgLTAsMCArMSwxMTQyIEBACisvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbG9jYWxlLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuICAqLworLyogV2luMzIgY29kZSB3cml0dGVuIGJ5IFRvciBMaWxscXZpc3QgPHRtbEBpa2kuZmk+LiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KKyMgdW5kZWYgV0lOMzIgICAvKiBhdm9pZCB3YXJuaW5nIG9uIG1pbmd3MzIgKi8KKyMgZGVmaW5lIFdJTjMyCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKy8qIExpc3Qgb2YgbGFuZ3VhZ2UgY29kZXMsIHNvcnRlZCBieSB2YWx1ZToKKyAgIDB4MDEgTEFOR19BUkFCSUMKKyAgIDB4MDIgTEFOR19CVUxHQVJJQU4KKyAgIDB4MDMgTEFOR19DQVRBTEFOCisgICAweDA0IExBTkdfQ0hJTkVTRQorICAgMHgwNSBMQU5HX0NaRUNICisgICAweDA2IExBTkdfREFOSVNICisgICAweDA3IExBTkdfR0VSTUFOCisgICAweDA4IExBTkdfR1JFRUsKKyAgIDB4MDkgTEFOR19FTkdMSVNICisgICAweDBhIExBTkdfU1BBTklTSAorICAgMHgwYiBMQU5HX0ZJTk5JU0gKKyAgIDB4MGMgTEFOR19GUkVOQ0gKKyAgIDB4MGQgTEFOR19IRUJSRVcKKyAgIDB4MGUgTEFOR19IVU5HQVJJQU4KKyAgIDB4MGYgTEFOR19JQ0VMQU5ESUMKKyAgIDB4MTAgTEFOR19JVEFMSUFOCisgICAweDExIExBTkdfSkFQQU5FU0UKKyAgIDB4MTIgTEFOR19LT1JFQU4KKyAgIDB4MTMgTEFOR19EVVRDSAorICAgMHgxNCBMQU5HX05PUldFR0lBTgorICAgMHgxNSBMQU5HX1BPTElTSAorICAgMHgxNiBMQU5HX1BPUlRVR1VFU0UKKyAgIDB4MTcgTEFOR19SSEFFVE9fUk9NQU5DRQorICAgMHgxOCBMQU5HX1JPTUFOSUFOCisgICAweDE5IExBTkdfUlVTU0lBTgorICAgMHgxYSBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgorICAgMHgxYiBMQU5HX1NMT1ZBSworICAgMHgxYyBMQU5HX0FMQkFOSUFOCisgICAweDFkIExBTkdfU1dFRElTSAorICAgMHgxZSBMQU5HX1RIQUkKKyAgIDB4MWYgTEFOR19UVVJLSVNICisgICAweDIwIExBTkdfVVJEVQorICAgMHgyMSBMQU5HX0lORE9ORVNJQU4KKyAgIDB4MjIgTEFOR19VS1JBSU5JQU4KKyAgIDB4MjMgTEFOR19CRUxBUlVTSUFOCisgICAweDI0IExBTkdfU0xPVkVOSUFOCisgICAweDI1IExBTkdfRVNUT05JQU4KKyAgIDB4MjYgTEFOR19MQVRWSUFOCisgICAweDI3IExBTkdfTElUSFVBTklBTgorICAgMHgyOCBMQU5HX1RBSklLCisgICAweDI5IExBTkdfRkFSU0kKKyAgIDB4MmEgTEFOR19WSUVUTkFNRVNFCisgICAweDJiIExBTkdfQVJNRU5JQU4KKyAgIDB4MmMgTEFOR19BWkVSSQorICAgMHgyZCBMQU5HX0JBU1FVRQorICAgMHgyZSBMQU5HX1NPUkJJQU4KKyAgIDB4MmYgTEFOR19NQUNFRE9OSUFOCisgICAweDMwIExBTkdfU1VUVQorICAgMHgzMSBMQU5HX1RTT05HQQorICAgMHgzMiBMQU5HX1RTV0FOQQorICAgMHgzMyBMQU5HX1ZFTkRBCisgICAweDM0IExBTkdfWEhPU0EKKyAgIDB4MzUgTEFOR19aVUxVCisgICAweDM2IExBTkdfQUZSSUtBQU5TCisgICAweDM3IExBTkdfR0VPUkdJQU4KKyAgIDB4MzggTEFOR19GQUVST0VTRQorICAgMHgzOSBMQU5HX0hJTkRJCisgICAweDNhIExBTkdfTUFMVEVTRQorICAgMHgzYiBMQU5HX1NBQU1JCisgICAweDNjIExBTkdfR0FFTElDCisgICAweDNkIExBTkdfWUlERElTSAorICAgMHgzZSBMQU5HX01BTEFZCisgICAweDNmIExBTkdfS0FaQUsKKyAgIDB4NDAgTEFOR19LWVJHWVoKKyAgIDB4NDEgTEFOR19TV0FISUxJCisgICAweDQyIExBTkdfVFVSS01FTgorICAgMHg0MyBMQU5HX1VaQkVLCisgICAweDQ0IExBTkdfVEFUQVIKKyAgIDB4NDUgTEFOR19CRU5HQUxJCisgICAweDQ2IExBTkdfUFVOSkFCSQorICAgMHg0NyBMQU5HX0dVSkFSQVRJCisgICAweDQ4IExBTkdfT1JJWUEKKyAgIDB4NDkgTEFOR19UQU1JTAorICAgMHg0YSBMQU5HX1RFTFVHVQorICAgMHg0YiBMQU5HX0tBTk5BREEKKyAgIDB4NGMgTEFOR19NQUxBWUFMQU0KKyAgIDB4NGQgTEFOR19BU1NBTUVTRQorICAgMHg0ZSBMQU5HX01BUkFUSEkKKyAgIDB4NGYgTEFOR19TQU5TS1JJVAorICAgMHg1MCBMQU5HX01PTkdPTElBTgorICAgMHg1MSBMQU5HX1RJQkVUQU4KKyAgIDB4NTIgTEFOR19XRUxTSAorICAgMHg1MyBMQU5HX0NBTUJPRElBTgorICAgMHg1NCBMQU5HX0xBTworICAgMHg1NSBMQU5HX0JVUk1FU0UKKyAgIDB4NTYgTEFOR19HQUxJQ0lBTgorICAgMHg1NyBMQU5HX0tPTktBTkkKKyAgIDB4NTggTEFOR19NQU5JUFVSSQorICAgMHg1OSBMQU5HX1NJTkRISQorICAgMHg1YSBMQU5HX1NZUklBQworICAgMHg1YiBMQU5HX1NJTkhBTEVTRQorICAgMHg1YyBMQU5HX0NIRVJPS0VFCisgICAweDVkIExBTkdfSU5VS1RJVFVUCisgICAweDVlIExBTkdfQU1IQVJJQworICAgMHg1ZiBMQU5HX1RBTUFaSUdIVAorICAgMHg2MCBMQU5HX0tBU0hNSVJJCisgICAweDYxIExBTkdfTkVQQUxJCisgICAweDYyIExBTkdfRlJJU0lBTgorICAgMHg2MyBMQU5HX1BBU0hUTworICAgMHg2NCBMQU5HX1RBR0FMT0cKKyAgIDB4NjUgTEFOR19ESVZFSEkKKyAgIDB4NjYgTEFOR19FRE8KKyAgIDB4NjcgTEFOR19GVUxGVUxERQorICAgMHg2OCBMQU5HX0hBVVNBCisgICAweDY5IExBTkdfSUJJQklPCisgICAweDZhIExBTkdfWU9SVUJBCisgICAweDcwIExBTkdfSUdCTworICAgMHg3MSBMQU5HX0tBTlVSSQorICAgMHg3MiBMQU5HX09ST01PCisgICAweDczIExBTkdfVElHUklOWUEKKyAgIDB4NzQgTEFOR19HVUFSQU5JCisgICAweDc1IExBTkdfSEFXQUlJQU4KKyAgIDB4NzYgTEFOR19MQVRJTgorICAgMHg3NyBMQU5HX1NPTUFMSQorICAgMHg3OCBMQU5HX1lJCisgICAweDc5IExBTkdfUEFQSUFNRU5UVQorKi8KKy8qIE1pbmd3IGhlYWRlcnMgZG9uJ3QgaGF2ZSBsYXRlc3QgbGFuZ3VhZ2UgYW5kIHN1Ymxhbmd1YWdlIGNvZGVzLiAgKi8KKyMgaWZuZGVmIExBTkdfQUZSSUtBQU5TCisjIGRlZmluZSBMQU5HX0FGUklLQUFOUyAweDM2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FMQkFOSUFOCisjIGRlZmluZSBMQU5HX0FMQkFOSUFOIDB4MWMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQU1IQVJJQworIyBkZWZpbmUgTEFOR19BTUhBUklDIDB4NWUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQVJBQklDCisjIGRlZmluZSBMQU5HX0FSQUJJQyAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FSTUVOSUFOCisjIGRlZmluZSBMQU5HX0FSTUVOSUFOIDB4MmIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQVNTQU1FU0UKKyMgZGVmaW5lIExBTkdfQVNTQU1FU0UgMHg0ZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19BWkVSSQorIyBkZWZpbmUgTEFOR19BWkVSSSAweDJjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0JBU1FVRQorIyBkZWZpbmUgTEFOR19CQVNRVUUgMHgyZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CRUxBUlVTSUFOCisjIGRlZmluZSBMQU5HX0JFTEFSVVNJQU4gMHgyMworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CRU5HQUxJCisjIGRlZmluZSBMQU5HX0JFTkdBTEkgMHg0NQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CVVJNRVNFCisjIGRlZmluZSBMQU5HX0JVUk1FU0UgMHg1NQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19DQU1CT0RJQU4KKyMgZGVmaW5lIExBTkdfQ0FNQk9ESUFOIDB4NTMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQ0FUQUxBTgorIyBkZWZpbmUgTEFOR19DQVRBTEFOIDB4MDMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQ0hFUk9LRUUKKyMgZGVmaW5lIExBTkdfQ0hFUk9LRUUgMHg1YworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ESVZFSEkKKyMgZGVmaW5lIExBTkdfRElWRUhJIDB4NjUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRURPCisjIGRlZmluZSBMQU5HX0VETyAweDY2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0VTVE9OSUFOCisjIGRlZmluZSBMQU5HX0VTVE9OSUFOIDB4MjUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRkFFUk9FU0UKKyMgZGVmaW5lIExBTkdfRkFFUk9FU0UgMHgzOAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19GQVJTSQorIyBkZWZpbmUgTEFOR19GQVJTSSAweDI5CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0ZSSVNJQU4KKyMgZGVmaW5lIExBTkdfRlJJU0lBTiAweDYyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0ZVTEZVTERFCisjIGRlZmluZSBMQU5HX0ZVTEZVTERFIDB4NjcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR0FFTElDCisjIGRlZmluZSBMQU5HX0dBRUxJQyAweDNjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0dBTElDSUFOCisjIGRlZmluZSBMQU5HX0dBTElDSUFOIDB4NTYKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR0VPUkdJQU4KKyMgZGVmaW5lIExBTkdfR0VPUkdJQU4gMHgzNworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19HVUFSQU5JCisjIGRlZmluZSBMQU5HX0dVQVJBTkkgMHg3NAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19HVUpBUkFUSQorIyBkZWZpbmUgTEFOR19HVUpBUkFUSSAweDQ3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0hBVVNBCisjIGRlZmluZSBMQU5HX0hBVVNBIDB4NjgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSEFXQUlJQU4KKyMgZGVmaW5lIExBTkdfSEFXQUlJQU4gMHg3NQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19IRUJSRVcKKyMgZGVmaW5lIExBTkdfSEVCUkVXIDB4MGQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSElOREkKKyMgZGVmaW5lIExBTkdfSElOREkgMHgzOQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19JQklCSU8KKyMgZGVmaW5lIExBTkdfSUJJQklPIDB4NjkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSUdCTworIyBkZWZpbmUgTEFOR19JR0JPIDB4NzAKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSU5ET05FU0lBTgorIyBkZWZpbmUgTEFOR19JTkRPTkVTSUFOIDB4MjEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSU5VS1RJVFVUCisjIGRlZmluZSBMQU5HX0lOVUtUSVRVVCAweDVkCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tBTk5BREEKKyMgZGVmaW5lIExBTkdfS0FOTkFEQSAweDRiCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tBTlVSSQorIyBkZWZpbmUgTEFOR19LQU5VUkkgMHg3MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQVNITUlSSQorIyBkZWZpbmUgTEFOR19LQVNITUlSSSAweDYwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tBWkFLCisjIGRlZmluZSBMQU5HX0tBWkFLIDB4M2YKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfS09OS0FOSQorIyBkZWZpbmUgTEFOR19LT05LQU5JIDB4NTcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfS1lSR1laCisjIGRlZmluZSBMQU5HX0tZUkdZWiAweDQwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0xBTworIyBkZWZpbmUgTEFOR19MQU8gMHg1NAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MQVRJTgorIyBkZWZpbmUgTEFOR19MQVRJTiAweDc2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0xBVFZJQU4KKyMgZGVmaW5lIExBTkdfTEFUVklBTiAweDI2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0xJVEhVQU5JQU4KKyMgZGVmaW5lIExBTkdfTElUSFVBTklBTiAweDI3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BQ0VET05JQU4KKyMgZGVmaW5lIExBTkdfTUFDRURPTklBTiAweDJmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTEFZCisjIGRlZmluZSBMQU5HX01BTEFZIDB4M2UKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTUFMQVlBTEFNCisjIGRlZmluZSBMQU5HX01BTEFZQUxBTSAweDRjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTFRFU0UKKyMgZGVmaW5lIExBTkdfTUFMVEVTRSAweDNhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTklQVVJJCisjIGRlZmluZSBMQU5HX01BTklQVVJJIDB4NTgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTUFSQVRISQorIyBkZWZpbmUgTEFOR19NQVJBVEhJIDB4NGUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTU9OR09MSUFOCisjIGRlZmluZSBMQU5HX01PTkdPTElBTiAweDUwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX05FUEFMSQorIyBkZWZpbmUgTEFOR19ORVBBTEkgMHg2MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19PUklZQQorIyBkZWZpbmUgTEFOR19PUklZQSAweDQ4CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX09ST01PCisjIGRlZmluZSBMQU5HX09ST01PIDB4NzIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfUEFQSUFNRU5UVQorIyBkZWZpbmUgTEFOR19QQVBJQU1FTlRVIDB4NzkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfUEFTSFRPCisjIGRlZmluZSBMQU5HX1BBU0hUTyAweDYzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1BVTkpBQkkKKyMgZGVmaW5lIExBTkdfUFVOSkFCSSAweDQ2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1JIQUVUT19ST01BTkNFCisjIGRlZmluZSBMQU5HX1JIQUVUT19ST01BTkNFIDB4MTcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0FBTUkKKyMgZGVmaW5lIExBTkdfU0FBTUkgMHgzYgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TQU5TS1JJVAorIyBkZWZpbmUgTEFOR19TQU5TS1JJVCAweDRmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NFUkJJQU4KKyMgZGVmaW5lIExBTkdfU0VSQklBTiAweDFhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NJTkRISQorIyBkZWZpbmUgTEFOR19TSU5ESEkgMHg1OQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TSU5IQUxFU0UKKyMgZGVmaW5lIExBTkdfU0lOSEFMRVNFIDB4NWIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0xPVkFLCisjIGRlZmluZSBMQU5HX1NMT1ZBSyAweDFiCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NPTUFMSQorIyBkZWZpbmUgTEFOR19TT01BTEkgMHg3NworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TT1JCSUFOCisjIGRlZmluZSBMQU5HX1NPUkJJQU4gMHgyZQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TVVRVCisjIGRlZmluZSBMQU5HX1NVVFUgMHgzMAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TV0FISUxJCisjIGRlZmluZSBMQU5HX1NXQUhJTEkgMHg0MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TWVJJQUMKKyMgZGVmaW5lIExBTkdfU1lSSUFDIDB4NWEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFHQUxPRworIyBkZWZpbmUgTEFOR19UQUdBTE9HIDB4NjQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFKSUsKKyMgZGVmaW5lIExBTkdfVEFKSUsgMHgyOAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UQU1BWklHSFQKKyMgZGVmaW5lIExBTkdfVEFNQVpJR0hUIDB4NWYKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFNSUwKKyMgZGVmaW5lIExBTkdfVEFNSUwgMHg0OQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UQVRBUgorIyBkZWZpbmUgTEFOR19UQVRBUiAweDQ0CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RFTFVHVQorIyBkZWZpbmUgTEFOR19URUxVR1UgMHg0YQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19USEFJCisjIGRlZmluZSBMQU5HX1RIQUkgMHgxZQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19USUJFVEFOCisjIGRlZmluZSBMQU5HX1RJQkVUQU4gMHg1MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19USUdSSU5ZQQorIyBkZWZpbmUgTEFOR19USUdSSU5ZQSAweDczCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RTT05HQQorIyBkZWZpbmUgTEFOR19UU09OR0EgMHgzMQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UU1dBTkEKKyMgZGVmaW5lIExBTkdfVFNXQU5BIDB4MzIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVFVSS01FTgorIyBkZWZpbmUgTEFOR19UVVJLTUVOIDB4NDIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVUtSQUlOSUFOCisjIGRlZmluZSBMQU5HX1VLUkFJTklBTiAweDIyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1VSRFUKKyMgZGVmaW5lIExBTkdfVVJEVSAweDIwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1VaQkVLCisjIGRlZmluZSBMQU5HX1VaQkVLIDB4NDMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVkVOREEKKyMgZGVmaW5lIExBTkdfVkVOREEgMHgzMworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19WSUVUTkFNRVNFCisjIGRlZmluZSBMQU5HX1ZJRVROQU1FU0UgMHgyYQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19XRUxTSAorIyBkZWZpbmUgTEFOR19XRUxTSCAweDUyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1hIT1NBCisjIGRlZmluZSBMQU5HX1hIT1NBIDB4MzQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWUkKKyMgZGVmaW5lIExBTkdfWUkgMHg3OAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ZSURESVNICisjIGRlZmluZSBMQU5HX1lJRERJU0ggMHgzZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ZT1JVQkEKKyMgZGVmaW5lIExBTkdfWU9SVUJBIDB4NmEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWlVMVQorIyBkZWZpbmUgTEFOR19aVUxVIDB4MzUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0lSQVEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0lSQVEgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfRUdZUFQKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0VHWVBUIDB4MDMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xJQllBCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19MSUJZQSAweDA0CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19BTEdFUklBCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19BTEdFUklBIDB4MDUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX01PUk9DQ08KKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX01PUk9DQ08gMHgwNgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVFVOSVNJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfVFVOSVNJQSAweDA3CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19PTUFOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19PTUFOIDB4MDgKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1lFTUVOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19ZRU1FTiAweDA5CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TWVJJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU1lSSUEgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfSk9SREFOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19KT1JEQU4gMHgwYgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfTEVCQU5PTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTEVCQU5PTiAweDBjCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19LVVdBSVQKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0tVV0FJVCAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19VQUUKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1VBRSAweDBlCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1FBVEFSCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19RQVRBUiAweDEwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0xBVElOCisjIGRlZmluZSBTVUJMQU5HX0FaRVJJX0xBVElOIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMKKyMgZGVmaW5lIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX0JFTkdBTElfSU5ESUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0gKKyMgZGVmaW5lIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVQorIyBkZWZpbmUgU1VCTEFOR19DSElORVNFX01BQ0FVIDB4MDUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EgMHgwNworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBIDB4MDgKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4KKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4gMHgwOQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0JFTElaRQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0JFTElaRSAweDBhCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCAweDBiCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0UKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRSAweDBjCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVMKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9QSElMSVBQSU5FUyAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBIDB4MGUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9IT05HS09ORworIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0lORElBIDB4MTAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBIDB4MTEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUgMHgxMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRworIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRyAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT05BQ08KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PTkFDTyAweDA2CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTIDB4MDcKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04gMHgwOAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ09OR08KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NPTkdPIDB4MDkKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwKKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ0FNRVJPT04KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OIDB4MGIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRSAweDBjCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NQUxJCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NQUxJIDB4MGQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08gMHgwZQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfSEFJVEkKKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0hBSVRJIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcKKyMgZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcgMHgwNAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTgorIyBkZWZpbmUgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTiAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0tBU0hNSVJJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX0tBU0hNSVJJX0lORElBIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEKKyMgZGVmaW5lIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTQorIyBkZWZpbmUgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX05FUEFMSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19ORVBBTElfSU5ESUEgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfSU5ESUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX1BBS0lTVEFOCisjIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU4gMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9ST01BTklBCisjIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBCisjIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkEgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0xBVElOCisjIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU4gMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDCisjIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgMHgwMworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TSU5ESElfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfU0lOREhJX0lORElBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOCisjIGRlZmluZSBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBIDB4MDQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQSAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BIDB4MDYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgMHgwNworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSAweDA4CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSAweDA5CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEVSVQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BFUlUgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSAweDBiCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUgorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IgMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NISUxFCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUgMHgwZAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZIDB4MGUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQSAweDEwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUiAweDExCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVMKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUyAweDEyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBIDB4MTMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTworIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPIDB4MTQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5ECisjIGRlZmluZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORCAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUMKKyMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQyAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19UQU1BWklHSFRfTEFUSU4gMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQQorIyBkZWZpbmUgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQSAweDAwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEKKyMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVJJVFJFQSAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VSRFVfUEFLSVNUQU4KKyMgZGVmaW5lIFNVQkxBTkdfVVJEVV9QQUtJU1RBTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VSRFVfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfVVJEVV9JTkRJQSAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0xBVElOCisjIGRlZmluZSBTVUJMQU5HX1VaQkVLX0xBVElOIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMKKyMgZGVmaW5lIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMgMHgwMgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mICdzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6CisgICAiRGlyZWN0cyAnc2V0bG9jYWxlKCknIHRvIHF1ZXJ5ICdjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAorICAgIHNldHRpbmcgb2YgJ2xvY2FsJy4iCisgICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIE5laXRoZXIgZG8gU1VTVjIgYW5kCisgICBJU08gQyA5OS4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQgc3lzdGVtcyAoZS5nLgorICAgdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLworI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgX19HTlVfTElCUkFSWV9fICYmIF9fR05VX0xJQlJBUllfXyA+PSAyKQorIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAorI2VuZGlmCisKKy8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBuYW1lLCBhbmQgY2Fub25pY2FsaXplIGl0IGludG8gWFBHIHN5bnRheAorICAgICBsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQorICAgVGhlIGNvZGVzZXQgcGFydCBpbiB0aGUgcmVzdWx0IGlzIG5vdCByZWxpYWJsZTsgdGhlIGxvY2FsZV9jaGFyc2V0KCkKKyAgIHNob3VsZCBiZSB1c2VkIGZvciBjb2Rlc2V0IGluZm9ybWF0aW9uIGluc3RlYWQuCisgICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gICovCisKK2NvbnN0IGNoYXIgKgorX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKK3sKKyAgY29uc3QgY2hhciAqcmV0dmFsOworCisjaWZuZGVmIFdJTjMyCisKKyAgLyogVXNlIHRoZSBQT1NJWCBtZXRob2RzIG9mIGxvb2tpbmcgdG8gJ0xDX0FMTCcsICdMQ194eHgnLCBhbmQgJ0xBTkcnLgorICAgICBPbiBzb21lIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgJ3NldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KKyMgaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCisgIHJldHZhbCA9IHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpOworIyBlbHNlCisgIC8qIFNldHRpbmcgb2YgTENfQUxMIG92ZXJ3cml0ZXMgYWxsIG90aGVyLiAgKi8KKyAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7CisgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KKyAgICAgIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKKwl7CisJICAvKiBMYXN0IHBvc3NpYmlsaXR5IGlzIHRoZSBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KKwkgIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKKwkgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKKwkgICAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzCisJICAgICAgIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICAqLworCSAgICByZXR2YWwgPSAiQyI7CisJfQorICAgIH0KKyMgZW5kaWYKKworICByZXR1cm4gcmV0dmFsOworCisjZWxzZSAvKiBXSU4zMiAqLworCisgIC8qIFJldHVybiBhbiBYUEcgc3R5bGUgbG9jYWxlIG5hbWUgbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bQG1vZGlmaWVyXS4KKyAgICAgRG9uJ3QgZXZlbiBib3RoZXIgZGV0ZXJtaW5pbmcgdGhlIGNvZGVzZXQ7IGl0J3Mgbm90IHVzZWZ1bCBpbiB0aGlzCisgICAgIGNvbnRleHQsIGJlY2F1c2UgbWVzc2FnZSBjYXRhbG9ncyBhcmUgbm90IHNwZWNpZmljIHRvIGEgc2luZ2xlCisgICAgIGNvZGVzZXQuICAqLworCisgIExDSUQgbGNpZDsKKyAgTEFOR0lEIGxhbmdpZDsKKyAgaW50IHByaW1hcnksIHN1YjsKKworICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHN5c3RlbSBzZXR0aW5ncyB0aHJvdWdoIGVudmlyb25tZW50CisgICAgIHZhcmlhYmxlcywgYXMgb24gUE9TSVggc3lzdGVtcy4gICovCisgIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCisgICAgcmV0dXJuIHJldHZhbDsKKyAgcmV0dmFsID0gZ2V0ZW52IChjYXRlZ29yeW5hbWUpOworICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCisgICAgcmV0dXJuIHJldHZhbDsKKyAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOworICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCisgICAgcmV0dXJuIHJldHZhbDsKKworICAvKiBVc2UgbmF0aXZlIFdpbjMyIEFQSSBsb2NhbGUgSUQuICAqLworICBsY2lkID0gR2V0VGhyZWFkTG9jYWxlICgpOworCisgIC8qIFN0cmlwIG9mZiB0aGUgc29ydGluZyBydWxlcywga2VlcCBvbmx5IHRoZSBsYW5ndWFnZSBwYXJ0LiAgKi8KKyAgbGFuZ2lkID0gTEFOR0lERlJPTUxDSUQgKGxjaWQpOworCisgIC8qIFNwbGl0IGludG8gbGFuZ3VhZ2UgYW5kIHRlcnJpdG9yeSBwYXJ0LiAgKi8KKyAgcHJpbWFyeSA9IFBSSU1BUllMQU5HSUQgKGxhbmdpZCk7CisgIHN1YiA9IFNVQkxBTkdJRCAobGFuZ2lkKTsKKworICAvKiBEaXNwYXRjaCBvbiBsYW5ndWFnZS4KKyAgICAgU2VlIGFsc28gaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL29ubGluZWRhdC9sYW5ndWFnZXMuaHRtbCAuCisgICAgIEZvciBkZXRhaWxzIGFib3V0IGxhbmd1YWdlcywgc2VlIGh0dHA6Ly93d3cuZXRobm9sb2d1ZS5jb20vIC4gICovCisgIHN3aXRjaCAocHJpbWFyeSkKKyAgICB7CisgICAgY2FzZSBMQU5HX0FGUklLQUFOUzogcmV0dXJuICJhZl9aQSI7CisgICAgY2FzZSBMQU5HX0FMQkFOSUFOOiByZXR1cm4gInNxX0FMIjsKKyAgICBjYXNlIExBTkdfQU1IQVJJQzogcmV0dXJuICJhbV9FVCI7CisgICAgY2FzZSBMQU5HX0FSQUJJQzoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQTogcmV0dXJuICJhcl9TQSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19JUkFROiByZXR1cm4gImFyX0lRIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0VHWVBUOiByZXR1cm4gImFyX0VHIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0xJQllBOiByZXR1cm4gImFyX0xZIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0FMR0VSSUE6IHJldHVybiAiYXJfRFoiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfTU9ST0NDTzogcmV0dXJuICJhcl9NQSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBOiByZXR1cm4gImFyX1ROIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX09NQU46IHJldHVybiAiYXJfT00iOworCWNhc2UgU1VCTEFOR19BUkFCSUNfWUVNRU46IHJldHVybiAiYXJfWUUiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfU1lSSUE6IHJldHVybiAiYXJfU1kiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfSk9SREFOOiByZXR1cm4gImFyX0pPIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0xFQkFOT046IHJldHVybiAiYXJfTEIiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfS1VXQUlUOiByZXR1cm4gImFyX0tXIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1VBRTogcmV0dXJuICJhcl9BRSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOOiByZXR1cm4gImFyX0JIIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1FBVEFSOiByZXR1cm4gImFyX1FBIjsKKwl9CisgICAgICByZXR1cm4gImFyIjsKKyAgICBjYXNlIExBTkdfQVJNRU5JQU46IHJldHVybiAiaHlfQU0iOworICAgIGNhc2UgTEFOR19BU1NBTUVTRTogcmV0dXJuICJhc19JTiI7CisgICAgY2FzZSBMQU5HX0FaRVJJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIEF6ZXJiYWlqYW5pIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworCWNhc2UgU1VCTEFOR19BWkVSSV9MQVRJTjogcmV0dXJuICJhel9BWkBsYXRpbiI7CisJY2FzZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDOiByZXR1cm4gImF6X0FaQGN5cmlsbGljIjsKKwl9CisgICAgICByZXR1cm4gImF6IjsKKyAgICBjYXNlIExBTkdfQkFTUVVFOgorICAgICAgcmV0dXJuICJldSI7IC8qIEFtYmlndW91czogY291bGQgYmUgImV1X0VTIiBvciAiZXVfRlIiLiAgKi8KKyAgICBjYXNlIExBTkdfQkVMQVJVU0lBTjogcmV0dXJuICJiZV9CWSI7CisgICAgY2FzZSBMQU5HX0JFTkdBTEk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0JFTkdBTElfSU5ESUE6IHJldHVybiAiYm5fSU4iOworCWNhc2UgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0g6IHJldHVybiAiYm5fQkQiOworCX0KKyAgICAgIHJldHVybiAiYm4iOworICAgIGNhc2UgTEFOR19CVUxHQVJJQU46IHJldHVybiAiYmdfQkciOworICAgIGNhc2UgTEFOR19CVVJNRVNFOiByZXR1cm4gIm15X01NIjsKKyAgICBjYXNlIExBTkdfQ0FNQk9ESUFOOiByZXR1cm4gImttX0tIIjsKKyAgICBjYXNlIExBTkdfQ0FUQUxBTjogcmV0dXJuICJjYV9FUyI7CisgICAgY2FzZSBMQU5HX0NIRVJPS0VFOiByZXR1cm4gImNocl9VUyI7CisgICAgY2FzZSBMQU5HX0NISU5FU0U6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0NISU5FU0VfVFJBRElUSU9OQUw6IHJldHVybiAiemhfVFciOworCWNhc2UgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQ6IHJldHVybiAiemhfQ04iOworCWNhc2UgU1VCTEFOR19DSElORVNFX0hPTkdLT05HOiByZXR1cm4gInpoX0hLIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU5HQVBPUkU6IHJldHVybiAiemhfU0ciOworCWNhc2UgU1VCTEFOR19DSElORVNFX01BQ0FVOiByZXR1cm4gInpoX01PIjsKKwl9CisgICAgICByZXR1cm4gInpoIjsKKyAgICBjYXNlIExBTkdfQ1JPQVRJQU46CQkvKiBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgorCQkJCSAqIFdoYXQgdXNlZCB0byBiZSBjYWxsZWQgU2VyYm8tQ3JvYXRpYW4KKwkJCQkgKiBzaG91bGQgcmVhbGx5IG5vdyBiZSB0d28gc2VwYXJhdGUKKwkJCQkgKiBsYW5ndWFnZXMgYmVjYXVzZSBvZiBwb2xpdGljYWwgcmVhc29ucy4KKwkJCQkgKiAoU2F5cyB0bWwsIHdobyBrbm93cyBub3RoaW5nIGFib3V0IFNlcmJpYW4KKwkJCQkgKiBvciBDcm9hdGlhbi4pCisJCQkJICogKEkgY2FuIGZlZWwgdGhvc2UgZmxhbWVzIGNvbWluZyBhbHJlYWR5LikKKwkJCQkgKi8KKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJocl9IUiI7CisJY2FzZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU46IHJldHVybiAic3JfQ1MiOworCWNhc2UgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDOiByZXR1cm4gInNyX0NTQGN5cmlsbGljIjsKKwl9CisgICAgICByZXR1cm4gImhyIjsKKyAgICBjYXNlIExBTkdfQ1pFQ0g6IHJldHVybiAiY3NfQ1oiOworICAgIGNhc2UgTEFOR19EQU5JU0g6IHJldHVybiAiZGFfREsiOworICAgIGNhc2UgTEFOR19ESVZFSEk6IHJldHVybiAiZHZfTVYiOworICAgIGNhc2UgTEFOR19EVVRDSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfRFVUQ0g6IHJldHVybiAibmxfTkwiOworCWNhc2UgU1VCTEFOR19EVVRDSF9CRUxHSUFOOiAvKiBGTEVNSVNILCBWTEFBTVMgKi8gcmV0dXJuICJubF9CRSI7CisJfQorICAgICAgcmV0dXJuICJubCI7CisgICAgY2FzZSBMQU5HX0VETzogcmV0dXJuICJiaW5fTkciOworICAgIGNhc2UgTEFOR19FTkdMSVNIOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCS8qIFNVQkxBTkdfRU5HTElTSF9VUyA9PSBTVUJMQU5HX0RFRkFVTFQuIEhlaC4gSSB0aG91Z2h0CisJICogRW5nbGlzaCB3YXMgdGhlIGxhbmd1YWdlIHNwb2tlbiBpbiBFbmdsYW5kLgorCSAqIE9oIHdlbGwuCisJICovCisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfVVM6IHJldHVybiAiZW5fVVMiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1VLOiByZXR1cm4gImVuX0dCIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9BVVM6IHJldHVybiAiZW5fQVUiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0NBTjogcmV0dXJuICJlbl9DQSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfTlo6IHJldHVybiAiZW5fTloiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0VJUkU6IHJldHVybiAiZW5fSUUiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQTogcmV0dXJuICJlbl9aQSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQTogcmV0dXJuICJlbl9KTSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOOiByZXR1cm4gImVuX0dEIjsgLyogR3JlbmFkYT8gKi8KKwljYXNlIFNVQkxBTkdfRU5HTElTSF9CRUxJWkU6IHJldHVybiAiZW5fQloiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEOiByZXR1cm4gImVuX1RUIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRTogcmV0dXJuICJlbl9aVyI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVM6IHJldHVybiAiZW5fUEgiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQTogcmV0dXJuICJlbl9JRCI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkc6IHJldHVybiAiZW5fSEsiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0lORElBOiByZXR1cm4gImVuX0lOIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQTogcmV0dXJuICJlbl9NWSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFOiByZXR1cm4gImVuX1NHIjsKKwl9CisgICAgICByZXR1cm4gImVuIjsKKyAgICBjYXNlIExBTkdfRVNUT05JQU46IHJldHVybiAiZXRfRUUiOworICAgIGNhc2UgTEFOR19GQUVST0VTRTogcmV0dXJuICJmb19GTyI7CisgICAgY2FzZSBMQU5HX0ZBUlNJOiByZXR1cm4gImZhX0lSIjsKKyAgICBjYXNlIExBTkdfRklOTklTSDogcmV0dXJuICJmaV9GSSI7CisgICAgY2FzZSBMQU5HX0ZSRU5DSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfRlJFTkNIOiByZXR1cm4gImZyX0ZSIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX0JFTEdJQU46IC8qIFdBTExPT04gKi8gcmV0dXJuICJmcl9CRSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTjogcmV0dXJuICJmcl9DQSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9TV0lTUzogcmV0dXJuICJmcl9DSCI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHOiByZXR1cm4gImZyX0xVIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX01PTkFDTzogcmV0dXJuICJmcl9NQyI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTOiByZXR1cm4gImZyIjsgLyogQ2FyaWJiZWFuPyAqLworCWNhc2UgU1VCTEFOR19GUkVOQ0hfUkVVTklPTjogcmV0dXJuICJmcl9SRSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT05HTzogcmV0dXJuICJmcl9DRyI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMOiByZXR1cm4gImZyX1NOIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OOiByZXR1cm4gImZyX0NNIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFOiByZXR1cm4gImZyX0NJIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX01BTEk6IHJldHVybiAiZnJfTUwiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTzogcmV0dXJuICJmcl9NQSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9IQUlUSTogcmV0dXJuICJmcl9IVCI7CisJfQorICAgICAgcmV0dXJuICJmciI7CisgICAgY2FzZSBMQU5HX0ZSSVNJQU46IHJldHVybiAiZnlfTkwiOworICAgIGNhc2UgTEFOR19GVUxGVUxERToKKyAgICAgIC8qIFNwb2tlbiBpbiBOaWdlcmlhLCBHdWluZWEsIFNlbmVnYWwsIE1hbGksIE5pZ2VyLCBDYW1lcm9vbiwgQmVuaW4uICovCisgICAgICByZXR1cm4gImZmX05HIjsKKyAgICBjYXNlIExBTkdfR0FFTElDOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgMHgwMTogLyogU0NPVFRJU0ggKi8gcmV0dXJuICJnZF9HQiI7CisJY2FzZSAweDAyOiAvKiBJUklTSCAqLyByZXR1cm4gImdhX0lFIjsKKwl9CisgICAgICByZXR1cm4gIkMiOworICAgIGNhc2UgTEFOR19HQUxJQ0lBTjogcmV0dXJuICJnbF9FUyI7CisgICAgY2FzZSBMQU5HX0dFT1JHSUFOOiByZXR1cm4gImthX0dFIjsKKyAgICBjYXNlIExBTkdfR0VSTUFOOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19HRVJNQU46IHJldHVybiAiZGVfREUiOworCWNhc2UgU1VCTEFOR19HRVJNQU5fU1dJU1M6IHJldHVybiAiZGVfQ0giOworCWNhc2UgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU46IHJldHVybiAiZGVfQVQiOworCWNhc2UgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRzogcmV0dXJuICJkZV9MVSI7CisJY2FzZSBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOOiByZXR1cm4gImRlX0xJIjsKKwl9CisgICAgICByZXR1cm4gImRlIjsKKyAgICBjYXNlIExBTkdfR1JFRUs6IHJldHVybiAiZWxfR1IiOworICAgIGNhc2UgTEFOR19HVUFSQU5JOiByZXR1cm4gImduX1BZIjsKKyAgICBjYXNlIExBTkdfR1VKQVJBVEk6IHJldHVybiAiZ3VfSU4iOworICAgIGNhc2UgTEFOR19IQVVTQTogcmV0dXJuICJoYV9ORyI7CisgICAgY2FzZSBMQU5HX0hBV0FJSUFOOgorICAgICAgLyogRklYTUU6IERvIHRoZXkgbWVhbiBIYXdhaWlhbiAoImhhd19VUyIsIDEwMDAgc3BlYWtlcnMpCisJIG9yIEhhd2FpaSBDcmVvbGUgRW5nbGlzaCAoImNwZV9VUyIsIDYwMDAwMCBzcGVha2Vycyk/ICAqLworICAgICAgcmV0dXJuICJjcGVfVVMiOworICAgIGNhc2UgTEFOR19IRUJSRVc6IHJldHVybiAiaGVfSUwiOworICAgIGNhc2UgTEFOR19ISU5ESTogcmV0dXJuICJoaV9JTiI7CisgICAgY2FzZSBMQU5HX0hVTkdBUklBTjogcmV0dXJuICJodV9IVSI7CisgICAgY2FzZSBMQU5HX0lCSUJJTzogcmV0dXJuICJuaWNfTkciOworICAgIGNhc2UgTEFOR19JQ0VMQU5ESUM6IHJldHVybiAiaXNfSVMiOworICAgIGNhc2UgTEFOR19JR0JPOiByZXR1cm4gImlnX05HIjsKKyAgICBjYXNlIExBTkdfSU5ET05FU0lBTjogcmV0dXJuICJpZF9JRCI7CisgICAgY2FzZSBMQU5HX0lOVUtUSVRVVDogcmV0dXJuICJpdV9DQSI7CisgICAgY2FzZSBMQU5HX0lUQUxJQU46CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0lUQUxJQU46IHJldHVybiAiaXRfSVQiOworCWNhc2UgU1VCTEFOR19JVEFMSUFOX1NXSVNTOiByZXR1cm4gIml0X0NIIjsKKwl9CisgICAgICByZXR1cm4gIml0IjsKKyAgICBjYXNlIExBTkdfSkFQQU5FU0U6IHJldHVybiAiamFfSlAiOworICAgIGNhc2UgTEFOR19LQU5OQURBOiByZXR1cm4gImtuX0lOIjsKKyAgICBjYXNlIExBTkdfS0FOVVJJOiByZXR1cm4gImtyX05HIjsKKyAgICBjYXNlIExBTkdfS0FTSE1JUkk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAia3NfUEsiOworCWNhc2UgU1VCTEFOR19LQVNITUlSSV9JTkRJQTogcmV0dXJuICJrc19JTiI7CisJfQorICAgICAgcmV0dXJuICJrcyI7CisgICAgY2FzZSBMQU5HX0tBWkFLOiByZXR1cm4gImtrX0taIjsKKyAgICBjYXNlIExBTkdfS09OS0FOSToKKyAgICAgIC8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCisgICAgICByZXR1cm4gImtva19JTiI7CisgICAgY2FzZSBMQU5HX0tPUkVBTjogcmV0dXJuICJrb19LUiI7CisgICAgY2FzZSBMQU5HX0tZUkdZWjogcmV0dXJuICJreV9LRyI7CisgICAgY2FzZSBMQU5HX0xBTzogcmV0dXJuICJsb19MQSI7CisgICAgY2FzZSBMQU5HX0xBVElOOiByZXR1cm4gImxhX1ZBIjsKKyAgICBjYXNlIExBTkdfTEFUVklBTjogcmV0dXJuICJsdl9MViI7CisgICAgY2FzZSBMQU5HX0xJVEhVQU5JQU46IHJldHVybiAibHRfTFQiOworICAgIGNhc2UgTEFOR19NQUNFRE9OSUFOOiByZXR1cm4gIm1rX01LIjsKKyAgICBjYXNlIExBTkdfTUFMQVk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX01BTEFZX01BTEFZU0lBOiByZXR1cm4gIm1zX01ZIjsKKwljYXNlIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU06IHJldHVybiAibXNfQk4iOworCX0KKyAgICAgIHJldHVybiAibXMiOworICAgIGNhc2UgTEFOR19NQUxBWUFMQU06IHJldHVybiAibWxfSU4iOworICAgIGNhc2UgTEFOR19NQUxURVNFOiByZXR1cm4gIm10X01UIjsKKyAgICBjYXNlIExBTkdfTUFOSVBVUkk6CisgICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworICAgICAgcmV0dXJuICJtbmlfSU4iOworICAgIGNhc2UgTEFOR19NQVJBVEhJOiByZXR1cm4gIm1yX0lOIjsKKyAgICBjYXNlIExBTkdfTU9OR09MSUFOOgorICAgICAgcmV0dXJuICJtbiI7IC8qIEFtYmlndW91czogY291bGQgYmUgIm1uX0NOIiBvciAibW5fTU4iLiAgKi8KKyAgICBjYXNlIExBTkdfTkVQQUxJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gIm5lX05QIjsKKwljYXNlIFNVQkxBTkdfTkVQQUxJX0lORElBOiByZXR1cm4gIm5lX0lOIjsKKwl9CisgICAgICByZXR1cm4gIm5lIjsKKyAgICBjYXNlIExBTkdfTk9SV0VHSUFOOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMOiByZXR1cm4gIm5vX05PIjsKKwljYXNlIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0s6IHJldHVybiAibm5fTk8iOworCX0KKyAgICAgIHJldHVybiAibm8iOworICAgIGNhc2UgTEFOR19PUklZQTogcmV0dXJuICJvcl9JTiI7CisgICAgY2FzZSBMQU5HX09ST01POiByZXR1cm4gIm9tX0VUIjsKKyAgICBjYXNlIExBTkdfUEFQSUFNRU5UVTogcmV0dXJuICJwYXBfQU4iOworICAgIGNhc2UgTEFOR19QQVNIVE86CisgICAgICByZXR1cm4gInBzIjsgLyogQW1iaWd1b3VzOiBjb3VsZCBiZSAicHNfUEsiIG9yICJwc19BRiIuICAqLworICAgIGNhc2UgTEFOR19QT0xJU0g6IHJldHVybiAicGxfUEwiOworICAgIGNhc2UgTEFOR19QT1JUVUdVRVNFOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFOiByZXR1cm4gInB0X1BUIjsKKwkvKiBIbW0uIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4gPT0gU1VCTEFOR19ERUZBVUxULgorCSAgIFNhbWUgcGhlbm9tZW5vbiBhcyBTVUJMQU5HX0VOR0xJU0hfVVMgPT0gU1VCTEFOR19ERUZBVUxULiAqLworCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTjogcmV0dXJuICJwdF9CUiI7CisJfQorICAgICAgcmV0dXJuICJwdCI7CisgICAgY2FzZSBMQU5HX1BVTkpBQkk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1BVTkpBQklfSU5ESUE6IHJldHVybiAicGFfSU4iOyAvKiBHdXJtdWtoaSBzY3JpcHQgKi8KKwljYXNlIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTjogcmV0dXJuICJwYV9QSyI7IC8qIEFyYWJpYyBzY3JpcHQgKi8KKwl9CisgICAgICByZXR1cm4gInBhIjsKKyAgICBjYXNlIExBTkdfUkhBRVRPX1JPTUFOQ0U6IHJldHVybiAicm1fQ0giOworICAgIGNhc2UgTEFOR19ST01BTklBTjoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQTogcmV0dXJuICJyb19STyI7CisJY2FzZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkE6IHJldHVybiAicm9fTUQiOworCX0KKyAgICAgIHJldHVybiAicm8iOworICAgIGNhc2UgTEFOR19SVVNTSUFOOgorICAgICAgcmV0dXJuICJydSI7IC8qIEFtYmlndW91czogY291bGQgYmUgInJ1X1JVIiBvciAicnVfVUEiIG9yICJydV9NRCIuICAqLworICAgIGNhc2UgTEFOR19TQUFNSTogLyogYWN0dWFsbHkgTm9ydGhlcm4gU2FtaSAqLyByZXR1cm4gInNlX05PIjsKKyAgICBjYXNlIExBTkdfU0FOU0tSSVQ6IHJldHVybiAic2FfSU4iOworICAgIGNhc2UgTEFOR19TSU5ESEk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1NJTkRISV9JTkRJQTogcmV0dXJuICJzZF9JTiI7CisJY2FzZSBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTjogcmV0dXJuICJzZF9QSyI7CisJfQorICAgICAgcmV0dXJuICJzZCI7CisgICAgY2FzZSBMQU5HX1NJTkhBTEVTRTogcmV0dXJuICJzaV9MSyI7CisgICAgY2FzZSBMQU5HX1NMT1ZBSzogcmV0dXJuICJza19TSyI7CisgICAgY2FzZSBMQU5HX1NMT1ZFTklBTjogcmV0dXJuICJzbF9TSSI7CisgICAgY2FzZSBMQU5HX1NPTUFMSTogcmV0dXJuICJzb19TTyI7CisgICAgY2FzZSBMQU5HX1NPUkJJQU46CisgICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworICAgICAgcmV0dXJuICJ3ZW5fREUiOworICAgIGNhc2UgTEFOR19TUEFOSVNIOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19TUEFOSVNIOiByZXR1cm4gImVzX0VTIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOOiByZXR1cm4gImVzX01YIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9NT0RFUk46CisJICByZXR1cm4gImVzX0VTQG1vZGVybiI7CS8qIG5vdCBzZWVuIG9uIFVuaXggKi8KKwljYXNlIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEE6IHJldHVybiAiZXNfR1QiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0E6IHJldHVybiAiZXNfQ1IiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX1BBTkFNQTogcmV0dXJuICJlc19QQSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDOiByZXR1cm4gImVzX0RPIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEE6IHJldHVybiAiZXNfVkUiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBOiByZXR1cm4gImVzX0NPIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QRVJVOiByZXR1cm4gImVzX1BFIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkE6IHJldHVybiAiZXNfQVIiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0VDVUFET1I6IHJldHVybiAiZXNfRUMiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NISUxFOiByZXR1cm4gImVzX0NMIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZOiByZXR1cm4gImVzX1VZIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWTogcmV0dXJuICJlc19QWSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQTogcmV0dXJuICJlc19CTyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1I6IHJldHVybiAiZXNfU1YiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTOiByZXR1cm4gImVzX0hOIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUE6IHJldHVybiAiZXNfTkkiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPOiByZXR1cm4gImVzX1BSIjsKKwl9CisgICAgICByZXR1cm4gImVzIjsKKyAgICBjYXNlIExBTkdfU1VUVTogcmV0dXJuICJibnRfVFoiOyAvKiBvciAic3RfTFMiIG9yICJuc29fWkEiPyAqLworICAgIGNhc2UgTEFOR19TV0FISUxJOiByZXR1cm4gInN3X0tFIjsKKyAgICBjYXNlIExBTkdfU1dFRElTSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJzdl9TRSI7CisJY2FzZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORDogcmV0dXJuICJzdl9GSSI7CisJfQorICAgICAgcmV0dXJuICJzdiI7CisgICAgY2FzZSBMQU5HX1NZUklBQzogcmV0dXJuICJzeXJfVFIiOyAvKiBBbiBleHRpbmN0IGxhbmd1YWdlLiAgKi8KKyAgICBjYXNlIExBTkdfVEFHQUxPRzogcmV0dXJuICJ0bF9QSCI7CisgICAgY2FzZSBMQU5HX1RBSklLOiByZXR1cm4gInRnX1RKIjsKKyAgICBjYXNlIExBTkdfVEFNQVpJR0hUOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIFRhbWF6aWdodCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKwljYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQzogcmV0dXJuICJiZXJfTUFAYXJhYmljIjsKKwljYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0xBVElOOiByZXR1cm4gImJlcl9NQUBsYXRpbiI7CisJfQorICAgICAgcmV0dXJuICJiZXJfTUEiOworICAgIGNhc2UgTEFOR19UQU1JTDoKKyAgICAgIHJldHVybiAidGEiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJ0YV9JTiIgb3IgInRhX0xLIiBvciAidGFfU0ciLiAgKi8KKyAgICBjYXNlIExBTkdfVEFUQVI6IHJldHVybiAidHRfUlUiOworICAgIGNhc2UgTEFOR19URUxVR1U6IHJldHVybiAidGVfSU4iOworICAgIGNhc2UgTEFOR19USEFJOiByZXR1cm4gInRoX1RIIjsKKyAgICBjYXNlIExBTkdfVElCRVRBTjogcmV0dXJuICJib19DTiI7CisgICAgY2FzZSBMQU5HX1RJR1JJTllBOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQTogcmV0dXJuICJ0aV9FVCI7CisJY2FzZSBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUE6IHJldHVybiAidGlfRVIiOworCX0KKyAgICAgIHJldHVybiAidGkiOworICAgIGNhc2UgTEFOR19UU09OR0E6IHJldHVybiAidHNfWkEiOworICAgIGNhc2UgTEFOR19UU1dBTkE6IHJldHVybiAidG5fQlciOworICAgIGNhc2UgTEFOR19UVVJLSVNIOiByZXR1cm4gInRyX1RSIjsKKyAgICBjYXNlIExBTkdfVFVSS01FTjogcmV0dXJuICJ0a19UTSI7CisgICAgY2FzZSBMQU5HX1VLUkFJTklBTjogcmV0dXJuICJ1a19VQSI7CisgICAgY2FzZSBMQU5HX1VSRFU6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU46IHJldHVybiAidXJfUEsiOworCWNhc2UgU1VCTEFOR19VUkRVX0lORElBOiByZXR1cm4gInVyX0lOIjsKKwl9CisgICAgICByZXR1cm4gInVyIjsKKyAgICBjYXNlIExBTkdfVVpCRUs6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1VaQkVLX0xBVElOOiByZXR1cm4gInV6X1VaIjsKKwljYXNlIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUM6IHJldHVybiAidXpfVVpAY3lyaWxsaWMiOworCX0KKyAgICAgIHJldHVybiAidXoiOworICAgIGNhc2UgTEFOR19WRU5EQTogcmV0dXJuICJ2ZV9aQSI7CisgICAgY2FzZSBMQU5HX1ZJRVROQU1FU0U6IHJldHVybiAidmlfVk4iOworICAgIGNhc2UgTEFOR19XRUxTSDogcmV0dXJuICJjeV9HQiI7CisgICAgY2FzZSBMQU5HX1hIT1NBOiByZXR1cm4gInhoX1pBIjsKKyAgICBjYXNlIExBTkdfWUk6IHJldHVybiAic2l0X0NOIjsKKyAgICBjYXNlIExBTkdfWUlERElTSDogcmV0dXJuICJ5aV9JTCI7CisgICAgY2FzZSBMQU5HX1lPUlVCQTogcmV0dXJuICJ5b19ORyI7CisgICAgY2FzZSBMQU5HX1pVTFU6IHJldHVybiAienVfWkEiOworICAgIGRlZmF1bHQ6IHJldHVybiAiQyI7CisgICAgfQorCisjZW5kaWYKK30KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL2xvZy5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvbG9nLmMJMjAwNC0wOS0xMiAxNDo0MDozNC41MTU3MjM3NjggLTA0MDAKQEAgLTAsMCArMSw5OCBAQAorLyogTG9nIGZpbGUgb3V0cHV0LgorICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogUHJpbnQgYW4gQVNDSUkgc3RyaW5nIHdpdGggcXVvdGVzIGFuZCBlc2NhcGUgc2VxdWVuY2VzIHdoZXJlIG5lZWRlZC4gICovCitzdGF0aWMgdm9pZAorcHJpbnRfZXNjYXBlZCAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzdHIpCit7CisgIHB1dGMgKCciJywgc3RyZWFtKTsKKyAgZm9yICg7ICpzdHIgIT0gJ1wwJzsgc3RyKyspCisgICAgaWYgKCpzdHIgPT0gJ1xuJykKKyAgICAgIHsKKwlmcHV0cyAoIlxcblwiIiwgc3RyZWFtKTsKKwlpZiAoc3RyWzFdID09ICdcMCcpCisJICByZXR1cm47CisJZnB1dHMgKCJcblwiIiwgc3RyZWFtKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaWYgKCpzdHIgPT0gJyInIHx8ICpzdHIgPT0gJ1xcJykKKwkgIHB1dGMgKCdcXCcsIHN0cmVhbSk7CisJcHV0YyAoKnN0ciwgc3RyZWFtKTsKKyAgICAgIH0KKyAgcHV0YyAoJyInLCBzdHJlYW0pOworfQorCisvKiBBZGQgdG8gdGhlIGxvZyBmaWxlIGFuIGVudHJ5IGRlbm90aW5nIGEgZmFpbGVkIHRyYW5zbGF0aW9uLiAgKi8KK3ZvaWQKK19ubF9sb2dfdW50cmFuc2xhdGVkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwgY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkJICAgICAgY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIGludCBwbHVyYWwpCit7CisgIHN0YXRpYyBjaGFyICpsYXN0X2xvZ2ZpbGVuYW1lID0gTlVMTDsKKyAgc3RhdGljIEZJTEUgKmxhc3RfbG9nZmlsZSA9IE5VTEw7CisgIEZJTEUgKmxvZ2ZpbGU7CisKKyAgLyogQ2FuIHdlIHJldXNlIHRoZSBsYXN0IG9wZW5lZCBsb2dmaWxlPyAgKi8KKyAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKGxvZ2ZpbGVuYW1lLCBsYXN0X2xvZ2ZpbGVuYW1lKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIENsb3NlIHRoZSBsYXN0IHVzZWQgbG9nZmlsZS4gICovCisgICAgICBpZiAobGFzdF9sb2dmaWxlbmFtZSAhPSBOVUxMKQorCXsKKwkgIGlmIChsYXN0X2xvZ2ZpbGUgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZjbG9zZSAobGFzdF9sb2dmaWxlKTsKKwkgICAgICBsYXN0X2xvZ2ZpbGUgPSBOVUxMOworCSAgICB9CisJICBmcmVlIChsYXN0X2xvZ2ZpbGVuYW1lKTsKKwkgIGxhc3RfbG9nZmlsZW5hbWUgPSBOVUxMOworCX0KKyAgICAgIC8qIE9wZW4gdGhlIGxvZ2ZpbGUuICAqLworICAgICAgbGFzdF9sb2dmaWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoc3RybGVuIChsb2dmaWxlbmFtZSkgKyAxKTsKKyAgICAgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lID09IE5VTEwpCisJcmV0dXJuOworICAgICAgc3RyY3B5IChsYXN0X2xvZ2ZpbGVuYW1lLCBsb2dmaWxlbmFtZSk7CisgICAgICBsYXN0X2xvZ2ZpbGUgPSBmb3BlbiAobG9nZmlsZW5hbWUsICJhIik7CisgICAgICBpZiAobGFzdF9sb2dmaWxlID09IE5VTEwpCisJcmV0dXJuOworICAgIH0KKyAgbG9nZmlsZSA9IGxhc3RfbG9nZmlsZTsKKworICBmcHJpbnRmIChsb2dmaWxlLCAiZG9tYWluICIpOworICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBkb21haW5uYW1lKTsKKyAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnaWQgIik7CisgIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIG1zZ2lkMSk7CisgIGlmIChwbHVyYWwpCisgICAgeworICAgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnaWRfcGx1cmFsICIpOworICAgICAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgbXNnaWQyKTsKKyAgICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ3N0clswXSBcIlwiXG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dzdHIgXCJcIlxuIik7CisgIHB1dGMgKCdcbicsIGxvZ2ZpbGUpOworfQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvTWFrZWZpbGUuaW4JMTk5OC0wNC0yNiAwOToyMjozNS4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9NYWtlZmlsZS5pbgkyMDA0LTA5LTEyIDE0OjQwOjM0LjUyMTcyMjg1NiAtMDQwMApAQCAtMSwxOSArMSwyMCBAQAotIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGluIEdOVSBOTFMgVXRpbGl0aWVzLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE1ha2VmaWxlIGZvciBkaXJlY3Rvcnkgd2l0aCBtZXNzYWdlIGNhdGFsb2cgaGFuZGxpbmcgbGlicmFyeSBvZiBHTlUgZ2V0dGV4dAorIyBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyMgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQogIyBhbnkgbGF0ZXIgdmVyc2lvbi4KICMKICMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAjCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjIFVTQS4KIAogUEFDS0FHRSA9IEBQQUNLQUdFQAogVkVSU0lPTiA9IEBWRVJTSU9OQApAQCAtMjMsMTE4ICsyNCwzNDEgQEAKIHNyY2RpciA9IEBzcmNkaXJACiB0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACiB0b3BfYnVpbGRkaXIgPSAuLgotVlBBVEggPSBAc3JjZGlyQAorI1ZQQVRIID0gJChzcmNkaXIpCiAKIHByZWZpeCA9IEBwcmVmaXhACiBleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKIHRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotbGliZGlyID0gJChleGVjX3ByZWZpeCkvbGliCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAorbGliZGlyID0gQGxpYmRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKIGxvY2FsZWRpciA9ICQoZGF0YWRpcikvbG9jYWxlCi1nbnVsb2NhbGVkaXIgPSAkKHByZWZpeCkvc2hhcmUvbG9jYWxlCi1nZXR0ZXh0c3JjZGlyID0gQGRhdGFkaXJAL2dldHRleHQvaW50bAotYWxpYXNwYXRoID0gJChsb2NhbGVkaXIpOi4KK2dldHRleHRzcmNkaXIgPSAkKGRhdGFkaXIpL2dldHRleHQvaW50bAorYWxpYXNwYXRoID0gJChsb2NhbGVkaXIpCiBzdWJkaXIgPSBpbnRsCiAKIElOU1RBTEwgPSBASU5TVEFMTEAKIElOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACiBNS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACitta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJChNS0lOU1RBTExESVJTKQogCi1sID0gQGxACitsID0gQElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYQAogCiBBUiA9IGFyCiBDQyA9IEBDQ0AKIExJQlRPT0wgPSBATElCVE9PTEAKIFJBTkxJQiA9IEBSQU5MSUJACitZQUNDID0gQElOVExCSVNPTkAgLXkgLWQKK1lGTEFHUyA9IC0tbmFtZS1wcmVmaXg9X19nZXR0ZXh0CiAKLURFRlMgPSAtRExPQ0FMRURJUj1cIiQobG9jYWxlZGlyKVwiIC1ER05VTE9DQUxFRElSPVwiJChnbnVsb2NhbGVkaXIpXCIgXAotLURMT0NBTEVfQUxJQVNfUEFUSD1cIiQoYWxpYXNwYXRoKVwiIEBERUZTQAorREVGUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLURMT0NBTEVfQUxJQVNfUEFUSD1cIiQoYWxpYXNwYXRoKVwiIFwKKy1ETElCRElSPVwiJChsaWJkaXIpXCIgLURJTl9MSUJJTlRMIFwKKy1ERU5BQkxFX1JFTE9DQVRBQkxFPTEgLURJTl9MSUJSQVJZIC1ESU5TVEFMTERJUj1cIiQobGliZGlyKVwiIC1ETk9fWE1BTExPQyBcCistRHNldF9yZWxvY2F0aW9uX3ByZWZpeD1saWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBcCistRHJlbG9jYXRlPWxpYmludGxfcmVsb2NhdGUgXAorLURERVBFTkRTX09OX0xJQklDT05WPTEgQERFRlNACiBDUFBGTEFHUyA9IEBDUFBGTEFHU0AKIENGTEFHUyA9IEBDRkxBR1NACiBMREZMQUdTID0gQExERkxBR1NACitMSUJTID0gQExJQlNACiAKIENPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCiAKLUhFQURFUlMgPSAkKENPTUhEUlMpIGxpYmdldHRleHQuaCBsb2FkaW5mby5oCi1DT01IRFJTID0gZ2V0dGV4dC5oIGdldHRleHRQLmggaGFzaC1zdHJpbmcuaAotU09VUkNFUyA9ICQoQ09NU1JDUykgaW50bC1jb21wYXQuYyBjYXQtY29tcGF0LmMKLUNPTVNSQ1MgPSBiaW5kdGV4dGRvbS5jIGRjZ2V0dGV4dC5jIGRnZXR0ZXh0LmMgZ2V0dGV4dC5jIFwKLWZpbmRkb21haW4uYyBsb2FkbXNnY2F0LmMgbG9jYWxlYWxpYXMuYyB0ZXh0ZG9tYWluLmMgbDEwbmZsaXN0LmMgXAotZXhwbG9kZW5hbWUuYwotT0JKRUNUUyA9IEBJTlRMT0JKU0AgYmluZHRleHRkb20uJGxvIGRjZ2V0dGV4dC4kbG8gZGdldHRleHQuJGxvIGdldHRleHQuJGxvIFwKLWZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvIGxvY2FsZWFsaWFzLiRsbyB0ZXh0ZG9tYWluLiRsbyBsMTBuZmxpc3QuJGxvIFwKLWV4cGxvZGVuYW1lLiRsbwotQ0FUT0JKUyA9IGNhdC1jb21wYXQuJGxvIC4uL3BvL2NhdC1pZC10YmwuJGxvCi1HRVRUT0JKUyA9IGludGwtY29tcGF0LiRsbwotRElTVEZJTEVTLmNvbW1vbiA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbiBsaW51eC1tc2cuc2VkIHBvMnRibC5zZWQuaW4gXAoteG9wZW4tbXNnLnNlZCAkKEhFQURFUlMpICQoU09VUkNFUykKK0hFQURFUlMgPSBcCisgIGdtby5oIFwKKyAgZ2V0dGV4dFAuaCBcCisgIGhhc2gtc3RyaW5nLmggXAorICBsb2FkaW5mby5oIFwKKyAgcGx1cmFsLWV4cC5oIFwKKyAgZXZhbC1wbHVyYWwuaCBcCisgIGxvY2FsY2hhcnNldC5oIFwKKyAgcmVsb2NhdGFibGUuaCBcCisgIHhzaXplLmggXAorICBwcmludGYtYXJncy5oIHByaW50Zi1hcmdzLmMgXAorICBwcmludGYtcGFyc2UuaCB3cHJpbnRmLXBhcnNlLmggcHJpbnRmLXBhcnNlLmMgXAorICB2YXNucHJpbnRmLmggdmFzbndwcmludGYuaCB2YXNucHJpbnRmLmMgXAorICBvczJjb21wYXQuaCBcCisgIGxpYmdudWludGwuaC5pbgorU09VUkNFUyA9IFwKKyAgYmluZHRleHRkb20uYyBcCisgIGRjZ2V0dGV4dC5jIFwKKyAgZGdldHRleHQuYyBcCisgIGdldHRleHQuYyBcCisgIGZpbmRkb21haW4uYyBcCisgIGxvYWRtc2djYXQuYyBcCisgIGxvY2FsZWFsaWFzLmMgXAorICB0ZXh0ZG9tYWluLmMgXAorICBsMTBuZmxpc3QuYyBcCisgIGV4cGxvZGVuYW1lLmMgXAorICBkY2lnZXR0ZXh0LmMgXAorICBkY25nZXR0ZXh0LmMgXAorICBkbmdldHRleHQuYyBcCisgIG5nZXR0ZXh0LmMgXAorICBwbHVyYWwueSBcCisgIHBsdXJhbC1leHAuYyBcCisgIGxvY2FsY2hhcnNldC5jIFwKKyAgcmVsb2NhdGFibGUuYyBcCisgIGxvY2FsZW5hbWUuYyBcCisgIGxvZy5jIFwKKyAgcHJpbnRmLmMgXAorICBvc2RlcC5jIFwKKyAgb3MyY29tcGF0LmMgXAorICBpbnRsLWNvbXBhdC5jCitPQkpFQ1RTID0gXAorICBiaW5kdGV4dGRvbS4kbG8gXAorICBkY2dldHRleHQuJGxvIFwKKyAgZGdldHRleHQuJGxvIFwKKyAgZ2V0dGV4dC4kbG8gXAorICBmaW5kZG9tYWluLiRsbyBcCisgIGxvYWRtc2djYXQuJGxvIFwKKyAgbG9jYWxlYWxpYXMuJGxvIFwKKyAgdGV4dGRvbWFpbi4kbG8gXAorICBsMTBuZmxpc3QuJGxvIFwKKyAgZXhwbG9kZW5hbWUuJGxvIFwKKyAgZGNpZ2V0dGV4dC4kbG8gXAorICBkY25nZXR0ZXh0LiRsbyBcCisgIGRuZ2V0dGV4dC4kbG8gXAorICBuZ2V0dGV4dC4kbG8gXAorICBwbHVyYWwuJGxvIFwKKyAgcGx1cmFsLWV4cC4kbG8gXAorICBsb2NhbGNoYXJzZXQuJGxvIFwKKyAgcmVsb2NhdGFibGUuJGxvIFwKKyAgbG9jYWxlbmFtZS4kbG8gXAorICBsb2cuJGxvIFwKKyAgcHJpbnRmLiRsbyBcCisgIG9zZGVwLiRsbyBcCisgIGludGwtY29tcGF0LiRsbworRElTVEZJTEVTLmNvbW1vbiA9IE1ha2VmaWxlLmluIFwKK2NvbmZpZy5jaGFyc2V0IGxvY2FsZS5hbGlhcyByZWYtYWRkLnNpbiByZWYtZGVsLnNpbiAkKEhFQURFUlMpICQoU09VUkNFUykKK0RJU1RGSUxFUy5nZW5lcmF0ZWQgPSBwbHVyYWwuYwogRElTVEZJTEVTLm5vcm1hbCA9IFZFUlNJT04KLURJU1RGSUxFUy5nZXR0ZXh0ID0gbGliaW50bC5nbGliYyBpbnRsaC5pbnN0LmluCitESVNURklMRVMuZ2V0dGV4dCA9IENPUFlJTkcuTElCLTIuMCBDT1BZSU5HLkxJQi0yLjEgbGliaW50bC5nbGliYyBcCitsaWJnbnVpbnRsLmhfdm1zIE1ha2VmaWxlLnZtcyBcCitsaWJnbnVpbnRsLmgubXN2Yy1zdGF0aWMgbGliZ251aW50bC5oLm1zdmMtc2hhcmVkIFJFQURNRS53b2UzMiBNYWtlZmlsZS5tc3ZjCitESVNURklMRVMub2Jzb2xldGUgPSB4b3Blbi1tc2cuc2VkIGxpbnV4LW1zZy5zZWQgcG8ydGJsLnNlZC5pbiBjYXQtY29tcGF0LmMgXAorQ09QWUlORy5MSUItMiBnZXR0ZXh0LmggbGliZ2V0dGV4dC5oIHBsdXJhbC1ldmFsLmMgbGliZ251aW50bC5oCisKK2FsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKK2FsbC15ZXM6IGxpYmludGwuJGxhIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCithbGwtbm86IGFsbC1uby1AQlVJTERfSU5DTFVERURfTElCSU5UTEAKK2FsbC1uby15ZXM6IGxpYmdudWludGwuJGxhCithbGwtbm8tbm86CisKK2xpYmludGwuYSBsaWJnbnVpbnRsLmE6ICQoT0JKRUNUUykKKwlybSAtZiAkQAorCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCisJJChSQU5MSUIpICRACisKK2xpYmludGwubGEgbGliZ251aW50bC5sYTogJChPQkpFQ1RTKQorCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgXAorCSAgJChDQykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBcCisJICAkKE9CSkVDVFMpIEBMVExJQklDT05WQCAkKExJQlMpIC1sYyBcCisJICAtdmVyc2lvbi1pbmZvICQoTFRWX0NVUlJFTlQpOiQoTFRWX1JFVklTSU9OKTokKExUVl9BR0UpIFwKKwkgIC1ycGF0aCAkKGxpYmRpcikgXAorCSAgLW5vLXVuZGVmaW5lZAorCisjIExpYnRvb2wncyBsaWJyYXJ5IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmludGwuCisjIEJlZm9yZSBtYWtpbmcgYSBnZXR0ZXh0IHJlbGVhc2UsIHRoZSBnZXR0ZXh0IG1haW50YWluZXIgbXVzdCBjaGFuZ2UgdGhpcworIyBhY2NvcmRpbmcgdG8gdGhlIGxpYnRvb2wgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAiTGlicmFyeSBpbnRlcmZhY2UgdmVyc2lvbnMiLgorIyBNYWludGFpbmVycyBvZiBvdGhlciBwYWNrYWdlcyB0aGF0IGluY2x1ZGUgdGhlIGludGwgZGlyZWN0b3J5IG11c3QgKm5vdCoKKyMgY2hhbmdlIHRoZXNlIHZhbHVlcy4KK0xUVl9DVVJSRU5UPTcKK0xUVl9SRVZJU0lPTj0wCitMVFZfQUdFPTQKIAogLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAubG8KKy5TVUZGSVhFUzogLmMgLnkgLm8gLmxvIC5zaW4gLnNlZAorCiAuYy5vOgogCSQoQ09NUElMRSkgJDwKLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkPAogCi1JTkNMVURFUyA9IC1JLi4gLUkuIC1JJCh0b3Bfc3JjZGlyKS9pbnRsIC1JJCh0b3Bfc3JjZGlyKS9saWIKKy55LmM6CisJJChZQUNDKSAkKFlGTEFHUykgLS1vdXRwdXQgJEAgJDwKKwlybSAtZiAkKi5oCiAKLWFsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKK2JpbmR0ZXh0ZG9tLmxvOiAkKHNyY2RpcikvYmluZHRleHRkb20uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvYmluZHRleHRkb20uYworZGNnZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNnZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjZ2V0dGV4dC5jCitkZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RnZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RnZXR0ZXh0LmMKK2dldHRleHQubG86ICQoc3JjZGlyKS9nZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2dldHRleHQuYworZmluZGRvbWFpbi5sbzogJChzcmNkaXIpL2ZpbmRkb21haW4uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZmluZGRvbWFpbi5jCitsb2FkbXNnY2F0LmxvOiAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2FkbXNnY2F0LmMKK2xvY2FsZWFsaWFzLmxvOiAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYwordGV4dGRvbWFpbi5sbzogJChzcmNkaXIpL3RleHRkb21haW4uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvdGV4dGRvbWFpbi5jCitsMTBuZmxpc3QubG86ICQoc3JjZGlyKS9sMTBuZmxpc3QuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbDEwbmZsaXN0LmMKK2V4cGxvZGVuYW1lLmxvOiAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYworZGNpZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjaWdldHRleHQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNpZ2V0dGV4dC5jCitkY25nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY25nZXR0ZXh0LmMKK2RuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RuZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kbmdldHRleHQuYworbmdldHRleHQubG86ICQoc3JjZGlyKS9uZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9uZ2V0dGV4dC5jCitwbHVyYWwubG86ICQoc3JjZGlyKS9wbHVyYWwuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcGx1cmFsLmMKK3BsdXJhbC1leHAubG86ICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC1leHAuYworbG9jYWxjaGFyc2V0LmxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCityZWxvY2F0YWJsZS5sbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKK2xvY2FsZW5hbWUubG86ICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZW5hbWUuYworbG9nLmxvOiAkKHNyY2RpcikvbG9nLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvZy5jCitwcmludGYubG86ICQoc3JjZGlyKS9wcmludGYuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcHJpbnRmLmMKK29zZGVwLmxvOiAkKHNyY2Rpcikvb3NkZXAuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2Rpcikvb3NkZXAuYworaW50bC1jb21wYXQubG86ICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCiAKLWFsbC15ZXM6IGxpYmludGwuJGxhIGludGxoLmluc3QKLWFsbC1ubzoKK3JlZi1hZGQuc2VkOiAkKHNyY2RpcikvcmVmLWFkZC5zaW4KKwlzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWFkZC5zaW4gPiB0LXJlZi1hZGQuc2VkCisJbXYgdC1yZWYtYWRkLnNlZCByZWYtYWRkLnNlZAorcmVmLWRlbC5zZWQ6ICQoc3JjZGlyKS9yZWYtZGVsLnNpbgorCXNlZCAtZSAnL14jL2QnIC1lICdzL0AnJ1BBQ0tBR0UnJ0AvQFBBQ0tBR0VAL2cnICQoc3JjZGlyKS9yZWYtZGVsLnNpbiA+IHQtcmVmLWRlbC5zZWQKKwltdiB0LXJlZi1kZWwuc2VkIHJlZi1kZWwuc2VkCiAKLWxpYmludGwuYTogJChPQkpFQ1RTKQotCXJtIC1mICRACi0JJChBUikgY3J1ICRAICQoT0JKRUNUUykKLQkkKFJBTkxJQikgJEAKK0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JLi4KIAotbGliaW50bC5sYTogJChPQkpFQ1RTKQotCSQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQykgJChMREZMQUdTKSAtbyAkQCAkKE9CSkVDVFMpIFwKLQkJICAgLXZlcnNpb24taW5mbyAxOjAgLXJwYXRoICQobGliZGlyKQorbGliZ251aW50bC5oOiAkKHNyY2RpcikvbGliZ251aW50bC5oLmluCisJc2VkIC1lICdzLEAnJ0hBVkVfUE9TSVhfUFJJTlRGJydALEBIQVZFX1BPU0lYX1BSSU5URkAsZycgXAorCSAgICAtZSAncyxAJydIQVZFX0FTUFJJTlRGJydALEBIQVZFX0FTUFJJTlRGQCxnJyBcCisJICAgIC1lICdzLEAnJ0hBVkVfU05QUklOVEYnJ0AsQEhBVkVfU05QUklOVEZALGcnIFwKKwkgICAgLWUgJ3MsQCcnSEFWRV9XUFJJTlRGJydALEBIQVZFX1dQUklOVEZALGcnIFwKKwkgIDwgJChzcmNkaXIpL2xpYmdudWludGwuaC5pbiA+IGxpYmdudWludGwuaAogCi0uLi9wby9jYXQtaWQtdGJsLiRsbzogLi4vcG8vY2F0LWlkLXRibC5jICQodG9wX3NyY2RpcikvcG8vJChQQUNLQUdFKS5wb3QKLQljZCAuLi9wbyAmJiAkKE1BS0UpIGNhdC1pZC10YmwuJGxvCitsaWJpbnRsLmg6IGxpYmdudWludGwuaAorCWNwIGxpYmdudWludGwuaCBsaWJpbnRsLmgKIAotY2hlY2s6IGFsbAorY2hhcnNldC5hbGlhczogJChzcmNkaXIpL2NvbmZpZy5jaGFyc2V0CisJJChTSEVMTCkgJChzcmNkaXIpL2NvbmZpZy5jaGFyc2V0ICdAaG9zdEAnID4gdC0kQAorCW12IHQtJEAgJEAKIAotIyBUaGlzIGluc3RhbGxhdGlvbiBnb2FsIGlzIG9ubHkgdXNlZCBpbiBHTlUgZ2V0dGV4dC4gIFBhY2thZ2VzIHdoaWNoCi0jIG9ubHkgdXNlIHRoZSBsaWJyYXJ5IHNob3VsZCB1c2UgaW5zdGFsbCBpbnN0ZWFkLgorY2hlY2s6IGFsbAogCiAjIFdlIG11c3Qgbm90IGluc3RhbGwgdGhlIGxpYmludGwuaC9saWJpbnRsLmEgZmlsZXMgaWYgd2UgYXJlIG9uIGEKLSMgc3lzdGVtIHdoaWNoIGhhcyB0aGUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGluIGl0cyBDIGxpYnJhcnkgb3IgaW4gYQotIyBzZXBhcmF0ZSBsaWJyYXJ5IG9yIHVzZSB0aGUgY2F0Z2V0cyBpbnRlcmZhY2UuICBBIHNwZWNpYWwgY2FzZSBpcwotIyB3aGVyZSBjb25maWd1cmUgZm91bmQgYSBwcmV2aW91c2x5IGluc3RhbGxlZCBHTlUgZ2V0dGV4dCBsaWJyYXJ5LgorIyBzeXN0ZW0gd2hpY2ggaGFzIHRoZSBHTlUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGluIGl0cyBDIGxpYnJhcnkgb3IgaW4gYQorIyBzZXBhcmF0ZSBsaWJyYXJ5LgogIyBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIG9uZSB3aGljaCBjb21lcyB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUKICMgcGFja2FnZSwgeW91IGhhdmUgdG8gdXNlIGBjb25maWd1cmUgLS13aXRoLWluY2x1ZGVkLWdldHRleHQnLgogaW5zdGFsbDogaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YQogaW5zdGFsbC1leGVjOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IiBcCi0JICAgJiYgdGVzdCAnQElOVExPQkpTQCcgPSAnJChHRVRUT0JKUyknOyB0aGVuIFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJChsaWJkaXIpICQoaW5jbHVkZWRpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChsaWJkaXIpICQoaW5jbHVkZWRpcik7IFwKKwlpZiB7IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtcnVudGltZSIgfHwgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IH0gXAorCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0geWVzOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKSAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgXAorCSAgJChJTlNUQUxMX0RBVEEpIGxpYmludGwuaCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgXAorCSAgICAkKElOU1RBTExfREFUQSkgbGliaW50bC4kbGEgJChERVNURElSKSQobGliZGlyKS9saWJpbnRsLiRsYTsgXAorCSAgaWYgdGVzdCAiQFJFTE9DQVRBQkxFQCIgPSB5ZXM7IHRoZW4gXAorCSAgICBkZXBlbmRlbmNpZXM9YHNlZCAtbiAtZSAncyxeZGVwZW5kZW5jeV9saWJzPVwoLipcKSxcMSxwJyA8ICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC5sYSB8IHNlZCAtZSAicyxeJywsIiAtZSAicywnXCQkLCwiYDsgXAorCSAgICBpZiB0ZXN0IC1uICIkJGRlcGVuZGVuY2llcyI7IHRoZW4gXAorCSAgICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC5sYTsgXAorCSAgICBmaTsgXAogCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBpbnRsaC5pbnN0ICQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCi0JICAkKElOU1RBTExfREFUQSkgbGliaW50bC5hICQobGliZGlyKS9saWJpbnRsLmE7IFwKIAllbHNlIFwKIAkgIDogOyBcCiAJZmkKLWluc3RhbGwtZGF0YTogYWxsCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAorCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJICAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpIGxpYmdudWludGwuJGxhICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC4kbGE7IFwKKwkgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvcHJlbG9hZGFibGVfbGliaW50bC5zbzsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC5zbyAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC4kbGE7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICB0ZXN0IEBHTElCQzIxQCAhPSBubyB8fCAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcik7IFwKKwkgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKKwkgIGRlc3Q9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgdGhlbiBcCisJICAgIG9yaWc9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCisJICAgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKwkgICAgcm0gLWYgJCR0ZW1wOyBcCiAJICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgICAgaWYgdGVzdCBAR0xJQkMyMUAgPSBubzsgdGhlbiBcCisJICAgICAgb3JpZz1jaGFyc2V0LmFsaWFzOyBcCisJICAgICAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAorCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCisJICAgICAgcm0gLWYgJCR0ZW1wOyBcCisJICAgIGZpOyBcCiAJICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpIFZFUlNJT04gJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCi0JICBkaXN0cz0iJChESVNURklMRVMuY29tbW9uKSI7IFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobG9jYWxlZGlyKTsgXAorCSAgdGVzdCAtZiAkKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhcyBcCisJICAgICYmIG9yaWc9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXMgXAorCSAgICB8fCBvcmlnPSQoc3JjZGlyKS9sb2NhbGUuYWxpYXM7IFwKKwkgIHRlbXA9JChERVNURElSKSQobG9jYWxlZGlyKS90LWxvY2FsZS5hbGlhczsgXAorCSAgZGVzdD0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhczsgXAorCSAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKwkgIHJtIC1mICQkdGVtcDsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQoraW5zdGFsbC1kYXRhOiBhbGwKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCisJICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9WRVJTSU9OOyBcCisJICAkKElOU1RBTExfREFUQSkgQ2hhbmdlTG9nLmluc3QgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvQ2hhbmdlTG9nOyBcCisJICBkaXN0cz0iQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pIjsgXAogCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSBcCisJCQkgICAgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCiAJICBkb25lOyBcCisJICBjaG1vZCBhK3ggJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvY29uZmlnLmNoYXJzZXQ7IFwKKwkgIGRpc3RzPSIkKERJU1RGSUxFUy5nZW5lcmF0ZWQpIjsgXAorCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRkaXIvJCRmaWxlIFwKKwkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwkgIGRpc3RzPSIkKERJU1RGSUxFUy5vYnNvbGV0ZSkiOyBcCisJICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCitpbnN0YWxsLXN0cmlwOiBpbnN0YWxsCisKK2luc3RhbGxkaXJzOgorCWlmIHsgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgfSBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAorCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSB5ZXM7IHRoZW4gXAorCSAgdGVzdCBAR0xJQkMyMUAgIT0gbm8gfHwgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxvY2FsZWRpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpOyBcCiAJZWxzZSBcCiAJICA6IDsgXAogCWZpCkBAIC0xNDMsMjIgKzM2Nyw3NiBAQAogaW5zdGFsbGNoZWNrOgogCiB1bmluc3RhbGw6Ci0JZGlzdHM9IiQoRElTVEZJTEVTLmNvbW1vbikiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgcm0gLWYgJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKLQlkb25lCisJaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICBybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC4kbGE7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubzsgdGhlbiBcCisJICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgdGhlbiBcCisJICAgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKKwkgICAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKKwkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAorCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAorCSAgICAgIHJtIC1mICQkZGVzdDsgXAorCSAgICBlbHNlIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICBmaTsgXAorCSAgICBybSAtZiAkJHRlbXA7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyB0aGVuIFwKKwkgICAgdGVtcD0kKERFU1RESVIpJChsb2NhbGVkaXIpL3QtbG9jYWxlLmFsaWFzOyBcCisJICAgIGRlc3Q9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXM7IFwKKwkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAorCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAorCSAgICAgIHJtIC1mICQkZGVzdDsgXAorCSAgICBlbHNlIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICBmaTsgXAorCSAgICBybSAtZiAkJHRlbXA7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAorCSAgZm9yIGZpbGUgaW4gVkVSU0lPTiBDaGFuZ2VMb2cgQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCk7IGRvIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCisJICBkb25lOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCiAKLWluZm8gZHZpOgoraW5mbyBkdmkgcHMgcGRmIGh0bWw6CiAKLSQoT0JKRUNUUyk6IC4uL2NvbmZpZy5oIGxpYmdldHRleHQuaAotYmluZHRleHRkb20uJGxvIGZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBsb2FkaW5mby5oCi1kY2dldHRleHQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBoYXNoLXN0cmluZy5oIGxvYWRpbmZvLmgKKyQoT0JKRUNUUyk6IC4uL2NvbmZpZy5oIGxpYmdudWludGwuaAorYmluZHRleHRkb20uJGxvIGRjZ2V0dGV4dC4kbG8gZGNpZ2V0dGV4dC4kbG8gZGNuZ2V0dGV4dC4kbG8gZGdldHRleHQuJGxvIGRuZ2V0dGV4dC4kbG8gZmluZGRvbWFpbi4kbG8gZ2V0dGV4dC4kbG8gaW50bC1jb21wYXQuJGxvIGxvYWRtc2djYXQuJGxvIGxvY2FsZWFsaWFzLiRsbyBuZ2V0dGV4dC4kbG8gdGV4dGRvbWFpbi4kbG86ICQoc3JjZGlyKS9nZXR0ZXh0UC5oICQoc3JjZGlyKS9nbW8uaCAkKHNyY2RpcikvbG9hZGluZm8uaAorZGNpZ2V0dGV4dC4kbG8gbG9hZG1zZ2NhdC4kbG86ICQoc3JjZGlyKS9oYXNoLXN0cmluZy5oCitleHBsb2RlbmFtZS4kbG8gbDEwbmZsaXN0LiRsbzogJChzcmNkaXIpL2xvYWRpbmZvLmgKK2RjaWdldHRleHQuJGxvIGxvYWRtc2djYXQuJGxvIHBsdXJhbC4kbG8gcGx1cmFsLWV4cC4kbG86ICQoc3JjZGlyKS9wbHVyYWwtZXhwLmgKK2RjaWdldHRleHQuJGxvOiAkKHNyY2RpcikvZXZhbC1wbHVyYWwuaAorbG9jYWxjaGFyc2V0LiRsbzogJChzcmNkaXIpL2xvY2FsY2hhcnNldC5oCitsb2NhbGVhbGlhcy4kbG8gbG9jYWxjaGFyc2V0LiRsbyByZWxvY2F0YWJsZS4kbG86ICQoc3JjZGlyKS9yZWxvY2F0YWJsZS5oCitwcmludGYuJGxvOiAkKHNyY2RpcikvcHJpbnRmLWFyZ3MuaCAkKHNyY2RpcikvcHJpbnRmLWFyZ3MuYyAkKHNyY2RpcikvcHJpbnRmLXBhcnNlLmggJChzcmNkaXIpL3dwcmludGYtcGFyc2UuaCAkKHNyY2RpcikveHNpemUuaCAkKHNyY2RpcikvcHJpbnRmLXBhcnNlLmMgJChzcmNkaXIpL3Zhc25wcmludGYuaCAkKHNyY2RpcikvdmFzbndwcmludGYuaCAkKHNyY2RpcikvdmFzbnByaW50Zi5jCiAKIHRhZ3M6IFRBR1MKIAogVEFHUzogJChIRUFERVJTKSAkKFNPVVJDRVMpCiAJaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIGV0YWdzIC1vICQkaGVyZS9UQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQogCitjdGFnczogQ1RBR1MKKworQ1RBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQorCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBjdGFncyAtbyAkJGhlcmUvQ1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCisKIGlkOiBJRAogCiBJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpCkBAIC0xNjYsMTIgKzQ0NCwxOSBAQAogCiAKIG1vc3RseWNsZWFuOgotCXJtIC1mICouYSAqLm8gKi5sbyBjb3JlIGNvcmUuKgorCXJtIC1mICouYSAqLmxhICoubyAqLm9iaiAqLmxvIGNvcmUgY29yZS4qCisJcm0gLWYgbGliZ251aW50bC5oIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCisJcm0gLWYgLXIgLmxpYnMgX2xpYnMKIAogY2xlYW46IG1vc3RseWNsZWFuCiAKIGRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBJRCBUQUdTIHBvMm1zZy5zZWQgcG8ydGJsLnNlZCBsaWJpbnRsLmgKKwlybSAtZiBNYWtlZmlsZSBJRCBUQUdTCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICBybSAtZiBDaGFuZ2VMb2cuaW5zdCAkKERJU1RGSUxFUy5ub3JtYWwpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCiAKIG1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgogCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCkBAIC0xODEsMzMgKzQ2NiwyNyBAQAogIyBHTlUgZ2V0dGV4dCBuZWVkcyBub3QgY29udGFpbiB0aGUgZmlsZSBgVkVSU0lPTicgYnV0IGNvbnRhaW5zIHNvbWUKICMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KIGRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IE1ha2VmaWxlICQoRElTVEZJTEVTKQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gZ2V0dGV4dDsgdGhlbiBcCi0JICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5nZXR0ZXh0KSI7IFwKK2Rpc3QgZGlzdGRpcjogTWFrZWZpbGUKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICA6IDsgXAogCWVsc2UgXAotCSAgYWRkaXRpb25hbD0iJChESVNURklMRVMubm9ybWFsKSI7IFwKLQlmaTsgXAotCWZvciBmaWxlIGluICQoRElTVEZJTEVTLmNvbW1vbikgJCRhZGRpdGlvbmFsOyBkbyBcCi0JICBsbiAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcikgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpOyBcCi0JZG9uZQotCi1kaXN0LWxpYmM6Ci0JdGFyIHpjdmYgaW50bC1nbGliYy50YXIuZ3ogJChDT01TUkNTKSAkKENPTUhEUlMpIGxpYmludGwuaC5nbGliYwotCi1NYWtlZmlsZTogTWFrZWZpbGUuaW4gLi4vY29uZmlnLnN0YXR1cwotCWNkIC4uIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCSAgaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIjsgdGhlbiBcCisJICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLmdldHRleHQpIjsgXAorCSAgZWxzZSBcCisJICAgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCisJICBmaTsgXAorCSAgJChNQUtFKSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCkgJCRhZGRpdGlvbmFsOyBcCisJICBmb3IgZmlsZSBpbiBDaGFuZ2VMb2cgJChESVNURklMRVMuY29tbW9uKSAkKERJU1RGSUxFUy5nZW5lcmF0ZWQpICQkYWRkaXRpb25hbDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkaXI9LjsgZWxzZSBkaXI9JChzcmNkaXIpOyBmaTsgXAorCSAgICBjcCAtcCAkJGRpci8kJGZpbGUgJChkaXN0ZGlyKTsgXAorCSAgZG9uZTsgXAorCWZpCiAKLSMgVGhlIGRlcGVuZGVuY3kgZm9yIGludGxoLmluc3QgaXMgZGlmZmVyZW50IGluIGdldHRleHQgYW5kIGFsbCBvdGhlcgotIyBwYWNrYWdlcy4gIEJlY2F1c2Ugd2UgY2Fubm90IHlvdSBHTlUgbWFrZSBmZWF0dXJlcyB3ZSBoYXZlIHRvIHNvbHZlCi0jIHRoZSBwcm9ibGVtIHdoaWxlIHJld3JpdGluZyBNYWtlZmlsZS5pbi4KLUBHVF9ZRVNAaW50bGguaW5zdDogaW50bGguaW5zdC5pbiAuLi9jb25maWcuc3RhdHVzCi1AR1RfWUVTQAljZCAuLiBcCi1AR1RfWUVTQAkmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSBcCi1AR1RfWUVTQAkgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotQEdUX05PQC5QSE9OWTogaW50bGguaW5zdAotQEdUX05PQGludGxoLmluc3Q6CitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworIyBUaGlzIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LCBidXQgZG9lc24ndCB3b3JrIGFueSBtb3JlIHdpdGggYXV0b2NvbmYtMi41NywKKyMgd2hlbiBBQ19DT05GSUdfRklMRVMoW2ludGwvTWFrZWZpbGU6c29tZWRpci9NYWtlZmlsZS5pbl0pIGlzIHVzZWQuCisjCWNkICQodG9wX2J1aWxkZGlyKSAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKIAogIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KICMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvbmdldHRleHQuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL25nZXR0ZXh0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC41MzM3MjEwMzIgLTA0MDAKQEAgLTAsMCArMSw2NSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgbmdldHRleHQoMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfTElCQworIyBkZWZpbmUgX19uZWVkX05VTEwKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBOR0VUVEVYVCBfX25nZXR0ZXh0CisjIGRlZmluZSBEQ05HRVRURVhUIF9fZGNuZ2V0dGV4dAorI2Vsc2UKKyMgZGVmaW5lIE5HRVRURVhUIGxpYmludGxfbmdldHRleHQKKyMgZGVmaW5lIERDTkdFVFRFWFQgbGliaW50bF9kY25nZXR0ZXh0CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBNU0dJRCBpdHNlbGYgKHRoZSBkZWZhdWx0CisgICB0ZXh0KS4gICovCitjaGFyICoKK05HRVRURVhUIChjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKK3sKKyAgcmV0dXJuIERDTkdFVFRFWFQgKE5VTEwsIG1zZ2lkMSwgbXNnaWQyLCBuLCBMQ19NRVNTQUdFUyk7Cit9CisKKyNpZmRlZiBfTElCQworLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCit3ZWFrX2FsaWFzIChfX25nZXR0ZXh0LCBuZ2V0dGV4dCk7CisjZW5kaWYKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL29zMmNvbXBhdC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvb3MyY29tcGF0LmMJMjAwNC0wOS0xMiAxNDo0MDozNC41Mzk3MjAxMjAgLTA0MDAKQEAgLTAsMCArMSw5OCBAQAorLyogT1MvMiBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2RlZmluZSBPUzJfQVdBUkUKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisvKiBBIHZlcnNpb24gb2YgZ2V0ZW52KCkgdGhhdCB3b3JrcyBmcm9tIERMTHMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIERvc1NjYW5FbnYgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBzek5hbWUsIHVuc2lnbmVkIGNoYXIgKipwcHN6VmFsdWUpOworCitjaGFyICoKK19ubF9nZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHVuc2lnbmVkIGNoYXIgKnZhbHVlOworICBpZiAoRG9zU2NhbkVudiAobmFtZSwgJnZhbHVlKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgZWxzZQorICAgIHJldHVybiB2YWx1ZTsKK30KKworLyogQSBmaXhlZCBzaXplIGJ1ZmZlci4gICovCitjaGFyIGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lW01BWFBBVEhMRU4rMV07CisKK2NoYXIgKl9ubG9zMl9saWJkaXIgPSBOVUxMOworY2hhciAqX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IE5VTEw7CitjaGFyICpfbmxvczJfbG9jYWxlZGlyID0gTlVMTDsKKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZAorbmxvczJfaW5pdGlhbGl6ZSAoKQoreworICBjaGFyICpyb290ID0gZ2V0ZW52ICgiVU5JWFJPT1QiKTsKKyAgY2hhciAqZ251bG9jYWxlZGlyID0gZ2V0ZW52ICgiR05VTE9DQUxFRElSIik7CisKKyAgX25sb3MyX2xpYmRpciA9IGdudWxvY2FsZWRpcjsKKyAgaWYgKCFfbmxvczJfbGliZGlyKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKyAgICAgICAgICBfbmxvczJfbGliZGlyID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTElCRElSKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xpYmRpciArIHNsLCBMSUJESVIsIHN0cmxlbiAoTElCRElSKSArIDEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9saWJkaXIgPSBMSUJESVI7CisgICAgfQorCisgIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBnbnVsb2NhbGVkaXI7CisgIGlmICghX25sb3MyX2xvY2FsZWFsaWFzcGF0aCkKKyAgICB7CisgICAgICBpZiAocm9vdCkKKyAgICAgICAgeworICAgICAgICAgIHNpemVfdCBzbCA9IHN0cmxlbiAocm9vdCk7CisgICAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IChjaGFyICopIG1hbGxvYyAoc2wgKyBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWFsaWFzcGF0aCwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWFsaWFzcGF0aCArIHNsLCBMT0NBTEVfQUxJQVNfUEFUSCwgc3RybGVuIChMT0NBTEVfQUxJQVNfUEFUSCkgKyAxKTsKKyAgICAgICAgfQorICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9sb2NhbGVhbGlhc3BhdGggPSBMT0NBTEVfQUxJQVNfUEFUSDsKKyAgICB9CisKKyAgX25sb3MyX2xvY2FsZWRpciA9IGdudWxvY2FsZWRpcjsKKyAgaWYgKCFfbmxvczJfbG9jYWxlZGlyKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKyAgICAgICAgICBfbmxvczJfbG9jYWxlZGlyID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTE9DQUxFRElSKSArIDEpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciwgcm9vdCwgc2wpOworICAgICAgICAgIG1lbWNweSAoX25sb3MyX2xvY2FsZWRpciArIHNsLCBMT0NBTEVESVIsIHN0cmxlbiAoTE9DQUxFRElSKSArIDEpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSBMT0NBTEVESVI7CisgICAgfQorCisgIGlmIChzdHJsZW4gKF9ubG9zMl9sb2NhbGVkaXIpIDw9IE1BWFBBVEhMRU4pCisgICAgc3RyY3B5IChsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZSwgX25sb3MyX2xvY2FsZWRpcik7Cit9Ci0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9vczJjb21wYXQuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL29zMmNvbXBhdC5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNTQ0NzE5MzYwIC0wNDAwCkBAIC0wLDAgKzEsNDYgQEAKKy8qIE9TLzIgY29tcGF0aWJpbGl0eSBkZWZpbmVzLgorICAgVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGZyb20gY29uZmlnLmgKKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogV2hlbiBpbmNsdWRlZCBmcm9tIG9zMmNvbXBhdC5oIHdlIG5lZWQgYWxsIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9ucyAqLworI2lmbmRlZiBPUzJfQVdBUkUKKworI3VuZGVmIExJQkRJUgorI2RlZmluZSBMSUJESVIJCQlfbmxvczJfbGliZGlyCitleHRlcm4gY2hhciAqX25sb3MyX2xpYmRpcjsKKworI3VuZGVmIExPQ0FMRURJUgorI2RlZmluZSBMT0NBTEVESVIJCV9ubG9zMl9sb2NhbGVkaXIKK2V4dGVybiBjaGFyICpfbmxvczJfbG9jYWxlZGlyOworCisjdW5kZWYgTE9DQUxFX0FMSUFTX1BBVEgKKyNkZWZpbmUgTE9DQUxFX0FMSUFTX1BBVEgJX25sb3MyX2xvY2FsZWFsaWFzcGF0aAorZXh0ZXJuIGNoYXIgKl9ubG9zMl9sb2NhbGVhbGlhc3BhdGg7CisKKyNlbmRpZgorCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCisjZGVmaW5lIHN0cmNhc2VjbXAgc3RyaWNtcAorI2RlZmluZSBzdHJuY2FzZWNtcCBzdHJuaWNtcAorCisvKiBXZSBoYXZlIG91ciBvd24gZ2V0ZW52KCkgd2hpY2ggd29ya3MgZXZlbiBpZiBsaWJyYXJ5IGlzIGNvbXBpbGVkIGFzIERMTCAqLworI2RlZmluZSBnZXRlbnYgX25sX2dldGVudgorCisvKiBPbGRlciB2ZXJzaW9ucyBvZiBnZXR0ZXh0IHVzZWQgLTEgYXMgdGhlIHZhbHVlIG9mIExDX01FU1NBR0VTICovCisjZGVmaW5lIExDX01FU1NBR0VTX0NPTVBBVCAoLTEpCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9vc2RlcC5jCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvb3NkZXAuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjU1MDcxODQ0OCAtMDQwMApAQCAtMCwwICsxLDI0IEBACisvKiBPUyBkZXBlbmRlbnQgcGFydHMgb2YgbGliaW50bC4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmIGRlZmluZWQgX19FTVhfXworIyBpbmNsdWRlICJvczJjb21wYXQuYyIKKyNlbHNlCisvKiBBdm9pZCBBSVggY29tcGlsZXIgd2FybmluZy4gICovCit0eXBlZGVmIGludCBkdW1teTsKKyNlbmRpZgotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcGx1cmFsLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9wbHVyYWwuYwkyMDA0LTA5LTEyIDE0OjQwOjM2LjU3MTQxMTI1NiAtMDQwMApAQCAtMCwwICsxLDE0OTAgQEAKKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGZyb20gcGx1cmFsLnkKKyAgIGJ5IEdOVSBiaXNvbiAxLjM1LiAgKi8KKworI2RlZmluZSBZWUJJU09OIDEgIC8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisKKyNkZWZpbmUgeXlwYXJzZSBfX2dldHRleHRwYXJzZQorI2RlZmluZSB5eWxleCBfX2dldHRleHRsZXgKKyNkZWZpbmUgeXllcnJvciBfX2dldHRleHRlcnJvcgorI2RlZmluZSB5eWx2YWwgX19nZXR0ZXh0bHZhbAorI2RlZmluZSB5eWNoYXIgX19nZXR0ZXh0Y2hhcgorI2RlZmluZSB5eWRlYnVnIF9fZ2V0dGV4dGRlYnVnCisjZGVmaW5lIHl5bmVycnMgX19nZXR0ZXh0bmVycnMKKyMgZGVmaW5lCUVRVU9QMgkyNTcKKyMgZGVmaW5lCUNNUE9QMgkyNTgKKyMgZGVmaW5lCUFERE9QMgkyNTkKKyMgZGVmaW5lCU1VTE9QMgkyNjAKKyMgZGVmaW5lCU5VTUJFUgkyNjEKKworI2xpbmUgMSAicGx1cmFsLnkiCisKKy8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzZXIgdXNlcyBhbGxvY2EuICBBSVggMyBmb3JjZXMgdXMgdG8gcHV0IHRoaXMKKyAgIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4gYmlzb24ncworICAgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+CisgICBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUgYXJiaXRyYXJ5IHN5c3RlbSBoZWFkZXJzLiAgKi8KKyNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KKyAjcHJhZ21hIGFsbG9jYQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisKKy8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKKyAgIGJ1dCB3ZSB3YW50IGl0IHRvIGJlIGNhbGxlZCBQTFVSQUxfUEFSU0UuICAqLworI2lmbmRlZiBfTElCQworIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCisjZW5kaWYKKworI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAorI2RlZmluZSBZWVBBUlNFX1BBUkFNCWFyZworCisjbGluZSA0OSAicGx1cmFsLnkiCisjaWZuZGVmIFlZU1RZUEUKK3R5cGVkZWYgdW5pb24geworICB1bnNpZ25lZCBsb25nIGludCBudW07CisgIGVudW0gb3BlcmF0b3Igb3A7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHA7Cit9IHl5c3R5cGU7CisjIGRlZmluZSBZWVNUWVBFIHl5c3R5cGUKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjZW5kaWYKKyNsaW5lIDU1ICJwbHVyYWwueSIKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBpbnQgeXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKTsKK3N0YXRpYyB2b2lkIHl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qIEFsbG9jYXRpb24gb2YgZXhwcmVzc2lvbnMuICAqLworCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cCAoaW50IG5hcmdzLCBlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqIGNvbnN0ICphcmdzKQoreworICBpbnQgaTsKKyAgc3RydWN0IGV4cHJlc3Npb24gKm5ld3A7CisKKyAgLyogSWYgYW55IG9mIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgbWFsbG9jJ2VkLCBqdXN0IHJldHVybiBOVUxMLiAgKi8KKyAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKyAgICBpZiAoYXJnc1tpXSA9PSBOVUxMKQorICAgICAgZ290byBmYWlsOworCisgIC8qIEFsbG9jYXRlIGEgbmV3IGV4cHJlc3Npb24uICAqLworICBuZXdwID0gKHN0cnVjdCBleHByZXNzaW9uICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOworICBpZiAobmV3cCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5ld3AtPm5hcmdzID0gbmFyZ3M7CisgICAgICBuZXdwLT5vcGVyYXRpb24gPSBvcDsKKyAgICAgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisJbmV3cC0+dmFsLmFyZ3NbaV0gPSBhcmdzW2ldOworICAgICAgcmV0dXJuIG5ld3A7CisgICAgfQorCisgZmFpbDoKKyAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKyAgICBGUkVFX0VYUFJFU1NJT04gKGFyZ3NbaV0pOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMCAoZW51bSBvcGVyYXRvciBvcCkKK3sKKyAgcmV0dXJuIG5ld19leHAgKDAsIG9wLCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzEgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMV07CisKKyAgYXJnc1swXSA9IHJpZ2h0OworICByZXR1cm4gbmV3X2V4cCAoMSwgb3AsIGFyZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8yIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqbGVmdCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1syXTsKKworICBhcmdzWzBdID0gbGVmdDsKKyAgYXJnc1sxXSA9IHJpZ2h0OworICByZXR1cm4gbmV3X2V4cCAoMiwgb3AsIGFyZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMyAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmJleHAsCisJICAgc3RydWN0IGV4cHJlc3Npb24gKnRicmFuY2gsIHN0cnVjdCBleHByZXNzaW9uICpmYnJhbmNoKQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1szXTsKKworICBhcmdzWzBdID0gYmV4cDsKKyAgYXJnc1sxXSA9IHRicmFuY2g7CisgIGFyZ3NbMl0gPSBmYnJhbmNoOworICByZXR1cm4gbmV3X2V4cCAoMywgb3AsIGFyZ3MpOworfQorCisjaWZuZGVmIFlZREVCVUcKKyMgZGVmaW5lIFlZREVCVUcgMAorI2VuZGlmCisKKworCisjZGVmaW5lCVlZRklOQUwJCTI3CisjZGVmaW5lCVlZRkxBRwkJLTMyNzY4CisjZGVmaW5lCVlZTlRCQVNFCTE2CisKKy8qIFlZVFJBTlNMQVRFKFlZTEVYKSAtLSBCaXNvbiB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gKi8KKyNkZWZpbmUgWVlUUkFOU0xBVEUoeCkgKCh1bnNpZ25lZCkoeCkgPD0gMjYxID8geXl0cmFuc2xhdGVbeF0gOiAxOCkKKworLyogWVlUUkFOU0xBVEVbWVlMRVhdIC0tIEJpc29uIHRva2VuIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAqLworc3RhdGljIGNvbnN0IGNoYXIgeXl0cmFuc2xhdGVbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAxMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA1LCAgICAgMiwKKyAgICAgIDE0LCAgICAxNSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAxMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgMTMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgIDExCit9OworCisjaWYgWVlERUJVRworc3RhdGljIGNvbnN0IHNob3J0IHl5cHJoc1tdID0KK3sKKyAgICAgICAwLCAgICAgMCwgICAgIDIsICAgICA4LCAgICAxMiwgICAgMTYsICAgIDIwLCAgICAyNCwgICAgMjgsICAgIDMyLAorICAgICAgMzUsICAgIDM3LCAgICAzOQorfTsKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0KK3sKKyAgICAgIDE3LCAgICAgMCwgICAgMTcsICAgICAzLCAgICAxNywgICAgMTIsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA0LAorICAgICAgMTcsICAgICAwLCAgICAxNywgICAgIDUsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA2LCAgICAxNywgICAgIDAsCisgICAgICAxNywgICAgIDcsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA4LCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgOSwKKyAgICAgIDE3LCAgICAgMCwgICAgMTAsICAgIDE3LCAgICAgMCwgICAgMTMsICAgICAwLCAgICAxMSwgICAgIDAsICAgIDE0LAorICAgICAgMTcsICAgIDE1LCAgICAgMAorfTsKKworI2VuZGlmCisKKyNpZiBZWURFQlVHCisvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9Cit7CisgICAgICAgMCwgICAxNTAsICAgMTU4LCAgIDE2MiwgICAxNjYsICAgMTcwLCAgIDE3NCwgICAxNzgsICAgMTgyLCAgIDE4NiwKKyAgICAgMTkwLCAgIDE5NCwgICAxOTkKK307CisjZW5kaWYKKworCisjaWYgKFlZREVCVUcpIHx8IGRlZmluZWQgWVlFUlJPUl9WRVJCT1NFCisKKy8qIFlZVE5BTUVbVE9LRU5fTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgdG9rZW4gVE9LRU5fTlVNLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9Cit7CisgICIkIiwgImVycm9yIiwgIiR1bmRlZmluZWQuIiwgIic/JyIsICInfCciLCAiJyYnIiwgIkVRVU9QMiIsICJDTVBPUDIiLCAKKyAgIkFERE9QMiIsICJNVUxPUDIiLCAiJyEnIiwgIk5VTUJFUiIsICInOiciLCAiJ24nIiwgIicoJyIsICInKSciLCAKKyAgInN0YXJ0IiwgImV4cCIsIDAKK307CisjZW5kaWYKKworLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPQoreworICAgICAgIDAsICAgIDE2LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsCisgICAgICAxNywgICAgMTcsICAgIDE3Cit9OworCisvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eXIyW10gPQoreworICAgICAgIDAsICAgICAxLCAgICAgNSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsCisgICAgICAgMSwgICAgIDEsICAgICAzCit9OworCisvKiBZWURFRkFDVFtTXSAtLSBkZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUgUyB3aGVuIFlZVEFCTEUKKyAgIGRvZXNuJ3Qgc3BlY2lmeSBzb21ldGhpbmcgZWxzZSB0byBkby4gIFplcm8gbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4KKyAgIGVycm9yLiAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmYWN0W10gPQoreworICAgICAgIDAsICAgICAwLCAgICAxMSwgICAgMTAsICAgICAwLCAgICAgMSwgICAgIDksICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDEyLCAgICAgMCwgICAgIDMsICAgICA0LCAgICAgNSwKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICAwLCAgICAgMiwgICAgIDAsICAgICAwLCAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0KK3sKKyAgICAgIDI1LCAgICAgNQorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0KK3sKKyAgICAgIC05LCAgICAtOSwtMzI3NjgsLTMyNzY4LCAgICAtOSwgICAgMzQsLTMyNzY4LCAgICAxMSwgICAgLTksICAgIC05LAorICAgICAgLTksICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LC0zMjc2OCwgICAgMjQsICAgIDM5LCAgICA0MywgICAgMTYsCisgICAgICAyNiwgICAgLTMsLTMyNzY4LCAgICAtOSwgICAgMzQsICAgIDIxLCAgICA1MywtMzI3NjgKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPQoreworICAtMzI3NjgsICAgIC0xCit9OworCisKKyNkZWZpbmUJWVlMQVNUCQk1MworCisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPQoreworICAgICAgIDYsICAgICAxLCAgICAgMiwgICAgIDcsICAgICAzLCAgICAgNCwgICAgMTQsICAgIDE2LCAgICAxNywgICAgMTgsCisgICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywKKyAgICAgIDE0LCAgICAyNiwgICAgMjQsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDEzLCAgICAxNCwgICAgMjMsICAgICA4LCAgICAgOSwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxMSwKKyAgICAgIDEyLCAgICAxMywgICAgMTQsICAgIDI3Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0KK3sKKyAgICAgICAxLCAgICAxMCwgICAgMTEsICAgICA0LCAgICAxMywgICAgMTQsICAgICA5LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsCisgICAgICAgOSwgICAgIDAsICAgIDIzLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxNSwgICAgIDMsICAgICA0LCAgICAgNSwKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAgOCwgICAgIDksICAgIDEyLCAgICAgMywgICAgIDQsICAgICA1LAorICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDYsCisgICAgICAgNywgICAgIDgsICAgICA5LCAgICAgMAorfTsKKyNkZWZpbmUgWVlQVVJFIDEKKworLyogLSotQy0qLSAgTm90ZSBzb21lIGNvbXBpbGVycyBjaG9rZSBvbiBjb21tZW50cyBvbiBgI2xpbmUnIGxpbmVzLiAgKi8KKyNsaW5lIDMgIi91c3IvbG9jYWwvc2hhcmUvYmlzb24vYmlzb24uc2ltcGxlIgorCisvKiBTa2VsZXRvbiBvdXRwdXQgcGFyc2VyIGZvciBiaXNvbiwKKworICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKKyAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLworCisvKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlciB3aGVuCisgICB0aGUgJXNlbWFudGljX3BhcnNlciBkZWNsYXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBncmFtbWFyLgorICAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCisgICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLworCisvKiBBbGwgc3ltYm9scyBkZWZpbmVkIGJlbG93IHNob3VsZCBiZWdpbiB3aXRoIHl5IG9yIFlZLCB0byBhdm9pZAorICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCisgICB2YXJpYWJsZXMsIGFzIHRoZXkgbWlnaHQgb3RoZXJ3aXNlIGJlIGV4cGFuZGVkIGJ5IHVzZXIgbWFjcm9zLgorICAgVGhlcmUgYXJlIHNvbWUgdW5hdm9pZGFibGUgZXhjZXB0aW9ucyB3aXRoaW4gaW5jbHVkZSBmaWxlcyB0bworICAgZGVmaW5lIG5lY2Vzc2FyeSBsaWJyYXJ5IHN5bWJvbHM7IHRoZXkgYXJlIG5vdGVkICJJTkZSSU5HRVMgT04KKyAgIFVTRVIgTkFNRSBTUEFDRSIgYmVsb3cuICAqLworCisjaWYgISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpCisKKy8qIFRoZSBwYXJzZXIgaW52b2tlcyBhbGxvY2Egb3IgbWFsbG9jOyBkZWZpbmUgdGhlIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KKworIyBpZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyBlbHNlCisjICBpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICAgaWYgZGVmaW5lZCAoYWxsb2NhKSB8fCBkZWZpbmVkIChfQUxMT0NBX0gpCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZkZWYgX19HTlVDX18KKyMgICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYnVpbHRpbl9hbGxvY2EKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBZWVNUQUNLX0FMTE9DCisgICAvKiBQYWNpZnkgR0NDJ3MgYGVtcHR5IGlmLWJvZHknIHdhcm5pbmcuICovCisjICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorIyAgZW5kaWYKKyMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIG1hbGxvYworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBmcmVlCisjIGVuZGlmCisjZW5kaWYgLyogISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpICovCisKKworI2lmICghIGRlZmluZWQgKHl5b3ZlcmZsb3cpIFwKKyAgICAgJiYgKCEgZGVmaW5lZCAoX19jcGx1c3BsdXMpIFwKKwkgfHwgKFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKKworLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCit1bmlvbiB5eWFsbG9jCit7CisgIHNob3J0IHl5c3M7CisgIFlZU1RZUEUgeXl2czsKKyMgaWYgWVlMU1BfTkVFREVECisgIFlZTFRZUEUgeXlsczsKKyMgZW5kaWYKK307CisKKy8qIFRoZSBzaXplIG9mIHRoZSBtYXhpbXVtIGdhcCBiZXR3ZWVuIG9uZSBhbGlnbmVkIHN0YWNrIGFuZCB0aGUgbmV4dC4gICovCisjIGRlZmluZSBZWVNUQUNLX0dBUF9NQVggKHNpemVvZiAodW5pb24geXlhbGxvYykgLSAxKQorCisvKiBUaGUgc2l6ZSBvZiBhbiBhcnJheSBsYXJnZSB0byBlbm91Z2ggdG8gaG9sZCBhbGwgc3RhY2tzLCBlYWNoIHdpdGgKKyAgIE4gZWxlbWVudHMuICAqLworIyBpZiBZWUxTUF9ORUVERUQKKyMgIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHNob3J0KSArIHNpemVvZiAoWVlTVFlQRSkgKyBzaXplb2YgKFlZTFRZUEUpKQlcCisgICAgICArIDIgKiBZWVNUQUNLX0dBUF9NQVgpCisjIGVsc2UKKyMgIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHNob3J0KSArIHNpemVvZiAoWVlTVFlQRSkpCQkJCVwKKyAgICAgICsgWVlTVEFDS19HQVBfTUFYKQorIyBlbmRpZgorCisvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KKyAgIG5vdCBvdmVybGFwLiAgKi8KKyMgaWZuZGVmIFlZQ09QWQorIyAgaWYgMSA8IF9fR05VQ19fCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpIFwKKyAgICAgIF9fYnVpbHRpbl9tZW1jcHkgKFRvLCBGcm9tLCAoQ291bnQpICogc2l6ZW9mICgqKEZyb20pKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkJCVwKKyAgICAgIGRvCQkJCQlcCisJewkJCQkJXAorCSAgcmVnaXN0ZXIgWVlTSVpFX1QgeXlpOwkJXAorCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKKwl9CQkJCQlcCisgICAgICB3aGlsZSAoMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQorICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCisgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKKyAgIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2spCQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorCVlZQ09QWSAoJnl5cHRyLT5TdGFjaywgU3RhY2ssIHl5c2l6ZSk7CQkJCVwKKwlTdGFjayA9ICZ5eXB0ci0+U3RhY2s7CQkJCQkJXAorCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWDsJXAorCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgd2hpbGUgKDApCisKKyNlbmRpZgorCisKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChfX1NJWkVfVFlQRV9fKQorIyBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXworI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoc2l6ZV90KQorIyBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQorIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjICBpbmNsdWRlIDxzdGRkZWYuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorIyBlbmRpZgorI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKKyMgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKKyNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQorI2RlZmluZSBZWUVNUFRZCQktMgorI2RlZmluZSBZWUVPRgkJMAorI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCisjZGVmaW5lIFlZQUJPUlQgCWdvdG8geXlhYm9ydGxhYgorI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQorLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseQorICAgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KKyNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCisjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKKyNkZWZpbmUgWVlCQUNLVVAoVG9rZW4sIFZhbHVlKQkJCQkJXAorZG8JCQkJCQkJCVwKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICB5eWNoYXIgPSAoVG9rZW4pOwkJCQkJCVwKKyAgICAgIHl5bHZhbCA9IChWYWx1ZSk7CQkJCQkJXAorICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCisgICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKKyAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAorICAgIH0JCQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJXAorICAgIHsgCQkJCQkJCQlcCisgICAgICB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOwkJCVwKKyAgICAgIFlZRVJST1I7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCit3aGlsZSAoMCkKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworCisvKiBZWUxMT0NfREVGQVVMVCAtLSBDb21wdXRlIHRoZSBkZWZhdWx0IGxvY2F0aW9uIChiZWZvcmUgdGhlIGFjdGlvbnMKKyAgIGFyZSBydW4pLgorCisgICBXaGVuIFlZTExPQ19ERUZBVUxUIGlzIHJ1biwgQ1VSUkVOVCBpcyBzZXQgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgZmlyc3QgdG9rZW4uICBCeSBkZWZhdWx0LCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgcmFuZ2VzLCBleHRlbmQKKyAgIGl0cyByYW5nZSB0byB0aGUgbGFzdCBzeW1ib2wuICAqLworCisjaWZuZGVmIFlZTExPQ19ERUZBVUxUCisjIGRlZmluZSBZWUxMT0NfREVGQVVMVChDdXJyZW50LCBSaHMsIE4pICAgICAgIAlcCisgICBDdXJyZW50Lmxhc3RfbGluZSAgID0gUmhzW05dLmxhc3RfbGluZTsJXAorICAgQ3VycmVudC5sYXN0X2NvbHVtbiA9IFJoc1tOXS5sYXN0X2NvbHVtbjsKKyNlbmRpZgorCisKKy8qIFlZTEVYIC0tIGNhbGxpbmcgYHl5bGV4JyB3aXRoIHRoZSByaWdodCBhcmd1bWVudHMuICAqLworCisjaWYgWVlQVVJFCisjIGlmIFlZTFNQX05FRURFRAorIyAgaWZkZWYgWVlMRVhfUEFSQU0KKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsLCAmeXlsbG9jLCBZWUxFWF9QQVJBTSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsLCAmeXlsbG9jKQorIyAgZW5kaWYKKyMgZWxzZSAvKiAhWVlMU1BfTkVFREVEICovCisjICBpZmRlZiBZWUxFWF9QQVJBTQorIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwpCisjICBlbmRpZgorIyBlbmRpZiAvKiAhWVlMU1BfTkVFREVEICovCisjZWxzZSAvKiAhWVlQVVJFICovCisjIGRlZmluZSBZWUxFWAkJCXl5bGV4ICgpCisjZW5kaWYgLyogIVlZUFVSRSAqLworCisKKy8qIEVuYWJsZSBkZWJ1Z2dpbmcgaWYgcmVxdWVzdGVkLiAgKi8KKyNpZiBZWURFQlVHCisKKyMgaWZuZGVmIFlZRlBSSU5URgorIyAgaW5jbHVkZSA8c3RkaW8uaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgZGVmaW5lIFlZRlBSSU5URiBmcHJpbnRmCisjIGVuZGlmCisKKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQkJCVwKK2RvIHsJCQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQkJXAorICAgIFlZRlBSSU5URiBBcmdzOwkJCQlcCit9IHdoaWxlICgwKQorLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0CisgICBtdWx0aXBsZSBwYXJzZXJzIGNhbiBjb2V4aXN0LiAgKi8KK2ludCB5eWRlYnVnOworI2Vsc2UgLyogIVlZREVCVUcgKi8KKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQorI2VuZGlmIC8qICFZWURFQlVHICovCisKKy8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KKyNpZm5kZWYJWVlJTklUREVQVEgKKyMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorI2VuZGlmCisKKy8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5CisgICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KKworICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKKyAgIFNJWkVfTUFYIDwgWVlTVEFDS19CWVRFUyAoWVlNQVhERVBUSCkKKyAgIGV2YWx1YXRlZCB3aXRoIGluZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuICAqLworCisjaWYgWVlNQVhERVBUSCA9PSAwCisjIHVuZGVmIFlZTUFYREVQVEgKKyNlbmRpZgorCisjaWZuZGVmIFlZTUFYREVQVEgKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKyNlbmRpZgorDAorI2lmZGVmIFlZRVJST1JfVkVSQk9TRQorCisjIGlmbmRlZiB5eXN0cmxlbgorIyAgaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfU1RSSU5HX0gpCisjICAgZGVmaW5lIHl5c3RybGVuIHN0cmxlbgorIyAgZWxzZQorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgWVlTVFIuICAqLworc3RhdGljIFlZU0laRV9UCisjICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoreXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQorIyAgIGVsc2UKK3l5c3RybGVuICh5eXN0cikKKyAgICAgY29uc3QgY2hhciAqeXlzdHI7CisjICAgZW5kaWYKK3sKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzdHI7CisKKyAgd2hpbGUgKCp5eXMrKyAhPSAnXDAnKQorICAgIGNvbnRpbnVlOworCisgIHJldHVybiB5eXMgLSB5eXN0ciAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiB5eXN0cGNweQorIyAgaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfU1RSSU5HX0gpICYmIGRlZmluZWQgKF9HTlVfU09VUkNFKQorIyAgIGRlZmluZSB5eXN0cGNweSBzdHBjcHkKKyMgIGVsc2UKKy8qIENvcHkgWVlTUkMgdG8gWVlERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nICdcMCcgaW4KKyAgIFlZREVTVC4gICovCitzdGF0aWMgY2hhciAqCisjICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoreXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCisjICAgZWxzZQoreXlzdHBjcHkgKHl5ZGVzdCwgeXlzcmMpCisgICAgIGNoYXIgKnl5ZGVzdDsKKyAgICAgY29uc3QgY2hhciAqeXlzcmM7CisjICAgZW5kaWYKK3sKKyAgcmVnaXN0ZXIgY2hhciAqeXlkID0geXlkZXN0OworICByZWdpc3RlciBjb25zdCBjaGFyICp5eXMgPSB5eXNyYzsKKworICB3aGlsZSAoKCp5eWQrKyA9ICp5eXMrKykgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlkIC0gMTsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKwwKKyNsaW5lIDMxNSAiL3Vzci9sb2NhbC9zaGFyZS9iaXNvbi9iaXNvbi5zaW1wbGUiCisKKworLyogVGhlIHVzZXIgY2FuIGRlZmluZSBZWVBBUlNFX1BBUkFNIGFzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAorICAgaW50byB5eXBhcnNlLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIHR5cGUgdm9pZCAqLgorICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KKyAgIEdyYW1tYXIgYWN0aW9ucyBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSBieSBjYXN0aW5nIGl0CisgICB0byB0aGUgcHJvcGVyIHBvaW50ZXIgdHlwZS4gICovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCisjIGVsc2UKKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07CisjIGVuZGlmCisjZWxzZSAvKiAhWVlQQVJTRV9QQVJBTSAqLworIyBkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKKyMgZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorI2VuZGlmIC8qICFZWVBBUlNFX1BBUkFNICovCisKKy8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBpZmRlZiBZWVBBUlNFX1BBUkFNCitpbnQgeXlwYXJzZSAodm9pZCAqKTsKKyMgZWxzZQoraW50IHl5cGFyc2UgKHZvaWQpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIFlZX0RFQ0xfVkFSSUFCTEVTIC0tIGRlcGVuZGluZyB3aGV0aGVyIHdlIHVzZSBhIHB1cmUgcGFyc2VyLAorICAgdmFyaWFibGVzIGFyZSBnbG9iYWwsIG9yIGxvY2FsIHRvIFlZUEFSU0UuICAqLworCisjZGVmaW5lIFlZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMJCQlcCisvKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCQkJCVwKK2ludCB5eWNoYXI7CQkJCQkJXAorCQkJCQkJCVwKKy8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9va2FoZWFkIHN5bWJvbC4gKi8JXAorWVlTVFlQRSB5eWx2YWw7CQkJCQkJXAorCQkJCQkJCVwKKy8qIE51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyLiAgKi8JCQlcCitpbnQgeXluZXJyczsKKworI2lmIFlZTFNQX05FRURFRAorIyBkZWZpbmUgWVlfREVDTF9WQVJJQUJMRVMJCQlcCitZWV9ERUNMX05PTl9MU1BfVkFSSUFCTEVTCQkJXAorCQkJCQkJXAorLyogTG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwlcCitZWUxUWVBFIHl5bGxvYzsKKyNlbHNlCisjIGRlZmluZSBZWV9ERUNMX1ZBUklBQkxFUwkJCVwKK1lZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMKKyNlbmRpZgorCisKKy8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlLiAqLworCisjaWYgIVlZUFVSRQorWVlfREVDTF9WQVJJQUJMRVMKKyNlbmRpZiAgLyogIVlZUFVSRSAqLworCitpbnQKK3l5cGFyc2UgKFlZUEFSU0VfUEFSQU1fQVJHKQorICAgICBZWVBBUlNFX1BBUkFNX0RFQ0wKK3sKKyAgLyogSWYgcmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUuICovCisjaWYgWVlQVVJFCisgIFlZX0RFQ0xfVkFSSUFCTEVTCisjZW5kaWYgIC8qICFZWVBVUkUgKi8KKworICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKKyAgcmVnaXN0ZXIgaW50IHl5bjsKKyAgaW50IHl5cmVzdWx0OworICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KKyAgaW50IHl5ZXJyc3RhdHVzOworICAvKiBMb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlci4gICovCisgIGludCB5eWNoYXIxID0gMDsKKworICAvKiBUaHJlZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLAorICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLAorICAgICBgeXlscyc6IHJlbGF0ZWQgdG8gbG9jYXRpb25zLgorCisgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KKworICAvKiBUaGUgc3RhdGUgc3RhY2suICovCisgIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsKKyAgc2hvcnQgKnl5c3MgPSB5eXNzYTsKKyAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOworCisgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOworICBZWVNUWVBFICp5eXZzID0geXl2c2E7CisgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworCisjaWYgWVlMU1BfTkVFREVECisgIC8qIFRoZSBsb2NhdGlvbiBzdGFjay4gICovCisgIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOworICBZWUxUWVBFICp5eWxzID0geXlsc2E7CisgIFlZTFRZUEUgKnl5bHNwOworI2VuZGlmCisKKyNpZiBZWUxTUF9ORUVERUQKKyMgZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSwgeXlsc3AtLSkKKyNlbHNlCisjIGRlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisjZW5kaWYKKworICBZWVNJWkVfVCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCisKKyAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKKyAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KKyAgWVlTVFlQRSB5eXZhbDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgWVlMVFlQRSB5eWxvYzsKKyNlbmRpZgorCisgIC8qIFdoZW4gcmVkdWNpbmcsIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkCisgICAgIHJ1bGUuICovCisgIGludCB5eWxlbjsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIikpOworCisgIHl5c3RhdGUgPSAwOworICB5eWVycnN0YXR1cyA9IDA7CisgIHl5bmVycnMgPSAwOworICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KKworICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgorICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKKyAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgorICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCisKKyAgeXlzc3AgPSB5eXNzOworICB5eXZzcCA9IHl5dnM7CisjaWYgWVlMU1BfTkVFREVECisgIHl5bHNwID0geXlsczsKKyNlbmRpZgorICBnb3RvIHl5c2V0c3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB5eW5ld3N0YXRlOgorICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuCisgICAgICovCisgIHl5c3NwKys7CisKKyB5eXNldHN0YXRlOgorICAqeXlzc3AgPSB5eXN0YXRlOworCisgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLworICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIHsKKwkvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2suIFVzZSBjb3BpZXMgb2YKKwkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCisJICAgbWVtb3J5LiAgKi8KKwlZWVNUWVBFICp5eXZzMSA9IHl5dnM7CisJc2hvcnQgKnl5c3MxID0geXlzczsKKworCS8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mIHRoZQorCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgKi8KKyMgaWYgWVlMU1BfTkVFREVECisJWVlMVFlQRSAqeXlsczEgPSB5eWxzOworCS8qIFRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywKKwkgICBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKwl5eW92ZXJmbG93ICgicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAorCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisJCSAgICAmeXlsczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisJeXlscyA9IHl5bHMxOworIyBlbHNlCisJeXlvdmVyZmxvdyAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCisJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAorCQkgICAgJnl5c3RhY2tzaXplKTsKKyMgZW5kaWYKKwl5eXNzID0geXlzczE7CisJeXl2cyA9IHl5dnMxOworICAgICAgfQorI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLworIyBpZm5kZWYgWVlTVEFDS19SRUxPQ0FURQorICAgICAgZ290byB5eW92ZXJmbG93bGFiOworIyBlbHNlCisgICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KKyAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQorCWdvdG8geXlvdmVyZmxvd2xhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXNob3J0ICp5eXNzMSA9IHl5c3M7CisJdW5pb24geXlhbGxvYyAqeXlwdHIgPQorCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKKwlpZiAoISB5eXB0cikKKwkgIGdvdG8geXlvdmVyZmxvd2xhYjsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXZzKTsKKyMgaWYgWVlMU1BfTkVFREVECisJWVlTVEFDS19SRUxPQ0FURSAoeXlscyk7CisjIGVuZGlmCisjIHVuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKwlpZiAoeXlzczEgIT0geXlzc2EpCisJICBZWVNUQUNLX0ZSRUUgKHl5c3MxKTsKKyAgICAgIH0KKyMgZW5kaWYKKyNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCisKKyAgICAgIHl5c3NwID0geXlzcyArIHl5c2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyB5eXNpemUgLSAxOworI2lmIFlZTFNQX05FRURFRAorICAgICAgeXlsc3AgPSB5eWxzICsgeXlzaXplIC0gMTsKKyNlbmRpZgorCisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOworCisgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKwlZWUFCT1JUOworICAgIH0KKworICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOworCisgIGdvdG8geXliYWNrdXA7CisKKworLyotLS0tLS0tLS0tLS4KK3wgeXliYWNrdXAuICB8CitgLS0tLS0tLS0tLS0qLworeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCisgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOworICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCisKKyAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCisgICAgeworICAgICAgeXljaGFyMSA9IDA7CisgICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisKKyNpZiBZWURFQlVHCisgICAgIC8qIFdlIGhhdmUgdG8ga2VlcCB0aGlzIGAjaWYgWVlERUJVRycsIHNpbmNlIHdlIHVzZSB2YXJpYWJsZXMKKwl3aGljaCBhcmUgZGVmaW5lZCBvbmx5IGlmIGBZWURFQlVHJyBpcyBzZXQuICAqLworICAgICAgaWYgKHl5ZGVidWcpCisJeworCSAgWVlGUFJJTlRGIChzdGRlcnIsICJOZXh0IHRva2VuIGlzICVkICglcyIsCisJCSAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKwkgIC8qIEdpdmUgdGhlIGluZGl2aWR1YWwgcGFyc2VyIGEgd2F5IHRvIHByaW50IHRoZSBwcmVjaXNlCisJICAgICBtZWFuaW5nIG9mIGEgdG9rZW4sIGZvciBmdXJ0aGVyIGRlYnVnZ2luZyBpbmZvLiAgKi8KKyMgaWZkZWYgWVlQUklOVAorCSAgWVlQUklOVCAoc3RkZXJyLCB5eWNoYXIsIHl5bHZhbCk7CisjIGVuZGlmCisJICBZWUZQUklOVEYgKHN0ZGVyciwgIilcbiIpOworCX0KKyNlbmRpZgorICAgIH0KKworICB5eW4gKz0geXljaGFyMTsKKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIHl5biA9IHl5dGFibGVbeXluXTsKKworICAvKiB5eW4gaXMgd2hhdCB0byBkbyBmb3IgdGhpcyB0b2tlbiB0eXBlIGluIHRoaXMgc3RhdGUuCisgICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KKyAgICAgUG9zaXRpdmUgPT4gc2hpZnQsIHl5biBpcyBuZXcgc3RhdGUuCisgICAgICAgTmV3IHN0YXRlIGlzIGZpbmFsIHN0YXRlID0+IGRvbid0IGJvdGhlciB0byBzaGlmdCwKKyAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgorICAgICAwLCBvciBtb3N0IG5lZ2F0aXZlIG51bWJlciA9PiBlcnJvci4gICovCisKKyAgaWYgKHl5biA8IDApCisgICAgeworICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCisJZ290byB5eWVycmxhYjsKKyAgICAgIHl5biA9IC15eW47CisgICAgICBnb3RvIHl5cmVkdWNlOworICAgIH0KKyAgZWxzZSBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKworICBpZiAoeXluID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlNoaWZ0aW5nIHRva2VuICVkICglcyksICIsCisJICAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKSk7CisKKyAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KKyAgaWYgKHl5Y2hhciAhPSBZWUVPRikKKyAgICB5eWNoYXIgPSBZWUVNUFRZOworCisgICorK3l5dnNwID0geXlsdmFsOworI2lmIFlZTFNQX05FRURFRAorICAqKyt5eWxzcCA9IHl5bGxvYzsKKyNlbmRpZgorCisgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKKyAgICAgc3RhdHVzLiAgKi8KKyAgaWYgKHl5ZXJyc3RhdHVzKQorICAgIHl5ZXJyc3RhdHVzLS07CisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZGVmYXVsdCAtLSBkbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZGVmYXVsdDoKKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gMCkKKyAgICBnb3RvIHl5ZXJybGFiOworICBnb3RvIHl5cmVkdWNlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cmVkdWNlIC0tIERvIGEgcmVkdWN0aW9uLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5cmVkdWNlOgorICAvKiB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworICB5eWxlbiA9IHl5cjJbeXluXTsKKworICAvKiBJZiBZWUxFTiBpcyBub256ZXJvLCBpbXBsZW1lbnQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbjoKKyAgICAgYCQkID0gJDEnLgorCisgICAgIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNldHMgWVlWQUwgdG8gdGhlIHNlbWFudGljIHZhbHVlIG9mCisgICAgIHRoZSBsb29rYWhlYWQgdG9rZW4uICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKyAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCisgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCisgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisKKyNpZiBZWUxTUF9ORUVERUQKKyAgLyogU2ltaWxhcmx5IGZvciB0aGUgZGVmYXVsdCBsb2NhdGlvbi4gIExldCB0aGUgdXNlciBydW4gYWRkaXRpb25hbAorICAgICBjb21tYW5kcyBpZiBmb3IgaW5zdGFuY2UgbG9jYXRpb25zIGFyZSByYW5nZXMuICAqLworICB5eWxvYyA9IHl5bHNwWzEteXlsZW5dOworICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWxzcCAtIHl5bGVuKSwgeXlsZW4pOworI2VuZGlmCisKKyNpZiBZWURFQlVHCisgIC8qIFdlIGhhdmUgdG8ga2VlcCB0aGlzIGAjaWYgWVlERUJVRycsIHNpbmNlIHdlIHVzZSB2YXJpYWJsZXMgd2hpY2gKKyAgICAgYXJlIGRlZmluZWQgb25seSBpZiBgWVlERUJVRycgaXMgc2V0LiAgKi8KKyAgaWYgKHl5ZGVidWcpCisgICAgeworICAgICAgaW50IHl5aTsKKworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJSZWR1Y2luZyB2aWEgcnVsZSAlZCAobGluZSAlZCksICIsCisJCSB5eW4sIHl5cmxpbmVbeXluXSk7CisKKyAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICAgICAgZm9yICh5eWkgPSB5eXByaHNbeXluXTsgeXlyaHNbeXlpXSA+IDA7IHl5aSsrKQorCVlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1t5eWldXSk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKKyAgICB9CisjZW5kaWYKKworICBzd2l0Y2ggKHl5bikgeworCitjYXNlIDE6CisjbGluZSAxNTEgInBsdXJhbC55IgoreworCSAgICBpZiAoeXl2c3BbMF0uZXhwID09IE5VTEwpCisJICAgICAgWVlBQk9SVDsKKwkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSB5eXZzcFswXS5leHA7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDI6CisjbGluZSAxNTkgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzMgKHFtb3AsIHl5dnNwWy00XS5leHAsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDM6CisjbGluZSAxNjMgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKGxvciwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgNDoKKyNsaW5lIDE2NyAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAobGFuZCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgNToKKyNsaW5lIDE3MSAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSA2OgorI2xpbmUgMTc1ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yICh5eXZzcFstMV0ub3AsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDc6CisjbGluZSAxNzkgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKHl5dnNwWy0xXS5vcCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgODoKKyNsaW5lIDE4MyAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSA5OgorI2xpbmUgMTg3ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8xIChsbm90LCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSAxMDoKKyNsaW5lIDE5MSAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMCAodmFyKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgMTE6CisjbGluZSAxOTUgInBsdXJhbC55IgoreworCSAgICBpZiAoKHl5dmFsLmV4cCA9IG5ld19leHBfMCAobnVtKSkgIT0gTlVMTCkKKwkgICAgICB5eXZhbC5leHAtPnZhbC5udW0gPSB5eXZzcFswXS5udW07CisJICB9CisgICAgYnJlYWs7CitjYXNlIDEyOgorI2xpbmUgMjAwICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0geXl2c3BbLTFdLmV4cDsKKwkgIH0KKyAgICBicmVhazsKK30KKworI2xpbmUgNzA1ICIvdXNyL2xvY2FsL3NoYXJlL2Jpc29uL2Jpc29uLnNpbXBsZSIKKworDAorICB5eXZzcCAtPSB5eWxlbjsKKyAgeXlzc3AgLT0geXlsZW47CisjaWYgWVlMU1BfTkVFREVECisgIHl5bHNwIC09IHl5bGVuOworI2VuZGlmCisKKyNpZiBZWURFQlVHCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICp5eXNzcDEgPSB5eXNzIC0gMTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAic3RhdGUgc3RhY2sgbm93Iik7CisgICAgICB3aGlsZSAoeXlzc3AxICE9IHl5c3NwKQorCVlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKisreXlzc3AxKTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAqKyt5eXZzcCA9IHl5dmFsOworI2lmIFlZTFNQX05FRURFRAorICAqKyt5eWxzcCA9IHl5bG9jOworI2VuZGlmCisKKyAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKKyAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCisgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVEJBU0VdICsgKnl5c3NwOworICBpZiAoeXlzdGF0ZSA+PSAwICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQorICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOworICBlbHNlCisgICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UQkFTRV07CisKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYiAtLSBoZXJlIG9uIGRldGVjdGluZyBlcnJvciB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJybGFiOgorICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KKyAgaWYgKCF5eWVycnN0YXR1cykKKyAgICB7CisgICAgICArK3l5bmVycnM7CisKKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCisJeworCSAgWVlTSVpFX1QgeXlzaXplID0gMDsKKwkgIGNoYXIgKnl5bXNnOworCSAgaW50IHl5eCwgeXljb3VudDsKKworCSAgeXljb3VudCA9IDA7CisJICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCisJICAgICBZWUNIRUNLLiAgKi8KKwkgIGZvciAoeXl4ID0geXluIDwgMCA/IC15eW4gOiAwOworCSAgICAgICB5eXggPCAoaW50KSAoc2l6ZW9mICh5eXRuYW1lKSAvIHNpemVvZiAoY2hhciAqKSk7IHl5eCsrKQorCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCkKKwkgICAgICB5eXNpemUgKz0geXlzdHJsZW4gKHl5dG5hbWVbeXl4XSkgKyAxNSwgeXljb3VudCsrOworCSAgeXlzaXplICs9IHl5c3RybGVuICgicGFyc2UgZXJyb3IsIHVuZXhwZWN0ZWQgIikgKyAxOworCSAgeXlzaXplICs9IHl5c3RybGVuICh5eXRuYW1lW1lZVFJBTlNMQVRFICh5eWNoYXIpXSk7CisJICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5c2l6ZSk7CisJICBpZiAoeXltc2cgIT0gMCkKKwkgICAgeworCSAgICAgIGNoYXIgKnl5cCA9IHl5c3RwY3B5ICh5eW1zZywgInBhcnNlIGVycm9yLCB1bmV4cGVjdGVkICIpOworCSAgICAgIHl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5dG5hbWVbWVlUUkFOU0xBVEUgKHl5Y2hhcildKTsKKworCSAgICAgIGlmICh5eWNvdW50IDwgNSkKKwkJeworCQkgIHl5Y291bnQgPSAwOworCQkgIGZvciAoeXl4ID0geXluIDwgMCA/IC15eW4gOiAwOworCQkgICAgICAgeXl4IDwgKGludCkgKHNpemVvZiAoeXl0bmFtZSkgLyBzaXplb2YgKGNoYXIgKikpOworCQkgICAgICAgeXl4KyspCisJCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCkKKwkJICAgICAgeworCQkJY29uc3QgY2hhciAqeXlxID0gISB5eWNvdW50ID8gIiwgZXhwZWN0aW5nICIgOiAiIG9yICI7CisJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXEpOworCQkJeXlwID0geXlzdHBjcHkgKHl5cCwgeXl0bmFtZVt5eXhdKTsKKwkJCXl5Y291bnQrKzsKKwkJICAgICAgfQorCQl9CisJICAgICAgeXllcnJvciAoeXltc2cpOworCSAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworCSAgICB9CisJICBlbHNlCisJICAgIHl5ZXJyb3IgKCJwYXJzZSBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYgLyogZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKSAqLworCXl5ZXJyb3IgKCJwYXJzZSBlcnJvciIpOworICAgIH0KKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJsYWIxIC0tIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IGFuIGFjdGlvbiB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWIxOgorICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuCisJIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCisgICAgICBpZiAoeXljaGFyID09IFlZRU9GKQorCVlZQUJPUlQ7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJEaXNjYXJkaW5nIHRva2VuICVkICglcykuXG4iLAorCQkgIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSkpOworICAgICAgeXljaGFyID0gWVlFTVBUWTsKKyAgICB9CisKKyAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgICAgIHRva2VuLiAgKi8KKworICB5eWVycnN0YXR1cyA9IDM7CQkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMgKi8KKworICBnb3RvIHl5ZXJyaGFuZGxlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJkZWZhdWx0IC0tIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIHwKK3wgZXJyb3IgdG9rZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJyZGVmYXVsdDoKKyNpZiAwCisgIC8qIFRoaXMgaXMgd3Jvbmc7IG9ubHkgc3RhdGVzIHRoYXQgZXhwbGljaXRseSB3YW50IGVycm9yIHRva2VucworICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCisKKyAgLyogSWYgaXRzIGRlZmF1bHQgaXMgdG8gYWNjZXB0IGFueSB0b2tlbiwgb2suICBPdGhlcndpc2UgcG9wIGl0LiAgKi8KKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4pCisgICAgZ290byB5eWRlZmF1bHQ7CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJwb3AgLS0gcG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgfAorfCBlcnJvciB0b2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJycG9wOgorICBpZiAoeXlzc3AgPT0geXlzcykKKyAgICBZWUFCT1JUOworICB5eXZzcC0tOworICB5eXN0YXRlID0gKi0teXlzc3A7CisjaWYgWVlMU1BfTkVFREVECisgIHl5bHNwLS07CisjZW5kaWYKKworI2lmIFlZREVCVUcKKyAgaWYgKHl5ZGVidWcpCisgICAgeworICAgICAgc2hvcnQgKnl5c3NwMSA9IHl5c3MgLSAxOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJFcnJvcjogc3RhdGUgc3RhY2sgbm93Iik7CisgICAgICB3aGlsZSAoeXlzc3AxICE9IHl5c3NwKQorCVlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKisreXlzc3AxKTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJoYW5kbGUuICB8CitgLS0tLS0tLS0tLS0tLS0qLworeXllcnJoYW5kbGU6CisgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSBZWUZMQUcpCisgICAgZ290byB5eWVycmRlZmF1bHQ7CisKKyAgeXluICs9IFlZVEVSUk9SOworICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQorICAgIGdvdG8geXllcnJkZWZhdWx0OworCisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8IDApCisgICAgeworICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCisJZ290byB5eWVycnBvcDsKKyAgICAgIHl5biA9IC15eW47CisgICAgICBnb3RvIHl5cmVkdWNlOworICAgIH0KKyAgZWxzZSBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycnBvcDsKKworICBpZiAoeXluID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpKTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhY2NlcHRsYWI6CisgIHl5cmVzdWx0ID0gMDsKKyAgZ290byB5eXJldHVybjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhYm9ydGxhYjoKKyAgeXlyZXN1bHQgPSAxOworICBnb3RvIHl5cmV0dXJuOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlvdmVyZmxvd2FiIC0tIHBhcnNlciBvdmVyZmxvdyBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eW92ZXJmbG93bGFiOgorICB5eWVycm9yICgicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7CisgIHl5cmVzdWx0ID0gMjsKKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKworeXlyZXR1cm46CisjaWZuZGVmIHl5b3ZlcmZsb3cKKyAgaWYgKHl5c3MgIT0geXlzc2EpCisgICAgWVlTVEFDS19GUkVFICh5eXNzKTsKKyNlbmRpZgorICByZXR1cm4geXlyZXN1bHQ7Cit9CisjbGluZSAyMDUgInBsdXJhbC55IgorCisKK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uCitGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCit7CisgIGlmIChleHAgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogSGFuZGxlIHRoZSByZWN1cnNpdmUgY2FzZS4gICovCisgIHN3aXRjaCAoZXhwLT5uYXJncykKKyAgICB7CisgICAgY2FzZSAzOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzJdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAyOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzFdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAxOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzBdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmcmVlIChleHApOworfQorCisKK3N0YXRpYyBpbnQKK3l5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCkKK3sKKyAgY29uc3QgY2hhciAqZXhwID0gKnBleHA7CisgIGludCByZXN1bHQ7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKGV4cFswXSA9PSAnXDAnKQorCXsKKwkgICpwZXhwID0gZXhwOworCSAgcmV0dXJuIFlZRU9GOworCX0KKworICAgICAgaWYgKGV4cFswXSAhPSAnICcgJiYgZXhwWzBdICE9ICdcdCcpCisJYnJlYWs7CisKKyAgICAgICsrZXhwOworICAgIH0KKworICByZXN1bHQgPSAqZXhwKys7CisgIHN3aXRjaCAocmVzdWx0KQorICAgIHsKKyAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgeworCXVuc2lnbmVkIGxvbmcgaW50IG4gPSByZXN1bHQgLSAnMCc7CisJd2hpbGUgKGV4cFswXSA+PSAnMCcgJiYgZXhwWzBdIDw9ICc5JykKKwkgIHsKKwkgICAgbiAqPSAxMDsKKwkgICAgbiArPSBleHBbMF0gLSAnMCc7CisJICAgICsrZXhwOworCSAgfQorCWx2YWwtPm51bSA9IG47CisJcmVzdWx0ID0gTlVNQkVSOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc9JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBlcXVhbDsKKwkgIHJlc3VsdCA9IEVRVU9QMjsKKwl9CisgICAgICBlbHNlCisJcmVzdWx0ID0gWVlFUlJDT0RFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICchJzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBub3RfZXF1YWw7CisJICByZXN1bHQgPSBFUVVPUDI7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcmJzoKKyAgICBjYXNlICd8JzoKKyAgICAgIGlmIChleHBbMF0gPT0gcmVzdWx0KQorCSsrZXhwOworICAgICAgZWxzZQorCXJlc3VsdCA9IFlZRVJSQ09ERTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPCc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gbGVzc19vcl9lcXVhbDsKKwl9CisgICAgICBlbHNlCisJbHZhbC0+b3AgPSBsZXNzX3RoYW47CisgICAgICByZXN1bHQgPSBDTVBPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGdyZWF0ZXJfb3JfZXF1YWw7CisJfQorICAgICAgZWxzZQorCWx2YWwtPm9wID0gZ3JlYXRlcl90aGFuOworICAgICAgcmVzdWx0ID0gQ01QT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcqJzoKKyAgICAgIGx2YWwtPm9wID0gbXVsdDsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnLyc6CisgICAgICBsdmFsLT5vcCA9IGRpdmlkZTsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJSc6CisgICAgICBsdmFsLT5vcCA9IG1vZHVsZTsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKyc6CisgICAgICBsdmFsLT5vcCA9IHBsdXM7CisgICAgICByZXN1bHQgPSBBRERPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy0nOgorICAgICAgbHZhbC0+b3AgPSBtaW51czsKKyAgICAgIHJlc3VsdCA9IEFERE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbic6CisgICAgY2FzZSAnPyc6CisgICAgY2FzZSAnOic6CisgICAgY2FzZSAnKCc6CisgICAgY2FzZSAnKSc6CisgICAgICAvKiBOb3RoaW5nLCBqdXN0IHJldHVybiB0aGUgY2hhcmFjdGVyLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnOyc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1wwJzoKKyAgICAgIC8qIEJlIHNhZmUgYW5kIGxldCB0aGUgdXNlciBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4uICAqLworICAgICAgLS1leHA7CisgICAgICByZXN1bHQgPSBZWUVPRjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9IFlZRVJSQ09ERTsKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIC0tZXhwOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICB9CisKKyAgKnBleHAgPSBleHA7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZAoreXllcnJvciAoY29uc3QgY2hhciAqc3RyKQoreworICAvKiBEbyBub3RoaW5nLiAgV2UgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZS4gICovCit9Ci0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9wbHVyYWwtZXhwLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9wbHVyYWwtZXhwLmMJMjAwNC0wOS0xMiAxNDo0MDozNC41Nzg3MTQxOTIgLTA0MDAKQEAgLTAsMCArMSwxNTQgQEAKKy8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisKKyNpZiAoZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX0FQUExFX0NDX18pIFwKKyAgICB8fCAoZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKworLyogVGhlc2Ugc3RydWN0cyBhcmUgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIHRoZSBnZXJtYW5pYyBwbHVyYWwKKyAgIGZvcm0gZGV0ZXJtaW5hdGlvbi4gIEl0IHJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gICJuICE9IDEiLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhciA9Cit7CisgIC5uYXJncyA9IDAsCisgIC5vcGVyYXRpb24gPSB2YXIsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uIHBsb25lID0KK3sKKyAgLm5hcmdzID0gMCwKKyAgLm9wZXJhdGlvbiA9IG51bSwKKyAgLnZhbCA9CisgIHsKKyAgICAubnVtID0gMQorICB9Cit9Oworc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMID0KK3sKKyAgLm5hcmdzID0gMiwKKyAgLm9wZXJhdGlvbiA9IG5vdF9lcXVhbCwKKyAgLnZhbCA9CisgIHsKKyAgICAuYXJncyA9CisgICAgeworICAgICAgWzBdID0gKHN0cnVjdCBleHByZXNzaW9uICopICZwbHZhciwKKyAgICAgIFsxXSA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSAmcGxvbmUKKyAgICB9CisgIH0KK307CisKKyMgZGVmaW5lIElOSVRfR0VSTUFOSUNfUExVUkFMKCkKKworI2Vsc2UKKworLyogRm9yIGNvbXBpbGVycyB3aXRob3V0IHN1cHBvcnQgZm9yIElTTyBDIDk5IHN0cnVjdC91bmlvbiBpbml0aWFsaXplcnM6CisgICBJbml0aWFsaXphdGlvbiBhdCBydW4tdGltZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhcjsKK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZTsKK3N0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTDsKKworc3RhdGljIHZvaWQKK2luaXRfZ2VybWFuaWNfcGx1cmFsICgpCit7CisgIGlmIChwbG9uZS52YWwubnVtID09IDApCisgICAgeworICAgICAgcGx2YXIubmFyZ3MgPSAwOworICAgICAgcGx2YXIub3BlcmF0aW9uID0gdmFyOworCisgICAgICBwbG9uZS5uYXJncyA9IDA7CisgICAgICBwbG9uZS5vcGVyYXRpb24gPSBudW07CisgICAgICBwbG9uZS52YWwubnVtID0gMTsKKworICAgICAgR0VSTUFOSUNfUExVUkFMLm5hcmdzID0gMjsKKyAgICAgIEdFUk1BTklDX1BMVVJBTC5vcGVyYXRpb24gPSBub3RfZXF1YWw7CisgICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMF0gPSAmcGx2YXI7CisgICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMV0gPSAmcGxvbmU7CisgICAgfQorfQorCisjIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpIGluaXRfZ2VybWFuaWNfcGx1cmFsICgpCisKKyNlbmRpZgorCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAoY29uc3QgY2hhciAqbnVsbGVudHJ5LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKnBsdXJhbHAsCisJCQkgICB1bnNpZ25lZCBsb25nIGludCAqbnBsdXJhbHNwKQoreworICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGx1cmFsOworICAgICAgY29uc3QgY2hhciAqbnBsdXJhbHM7CisKKyAgICAgIHBsdXJhbCA9IHN0cnN0ciAobnVsbGVudHJ5LCAicGx1cmFsPSIpOworICAgICAgbnBsdXJhbHMgPSBzdHJzdHIgKG51bGxlbnRyeSwgIm5wbHVyYWxzPSIpOworICAgICAgaWYgKHBsdXJhbCA9PSBOVUxMIHx8IG5wbHVyYWxzID09IE5VTEwpCisJZ290byBub19wbHVyYWw7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqZW5kcDsKKwkgIHVuc2lnbmVkIGxvbmcgaW50IG47CisJICBzdHJ1Y3QgcGFyc2VfYXJncyBhcmdzOworCisJICAvKiBGaXJzdCBnZXQgdGhlIG51bWJlci4gICovCisJICBucGx1cmFscyArPSA5OworCSAgd2hpbGUgKCpucGx1cmFscyAhPSAnXDAnICYmIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqbnBsdXJhbHMpKQorCSAgICArK25wbHVyYWxzOworCSAgaWYgKCEoKm5wbHVyYWxzID49ICcwJyAmJiAqbnBsdXJhbHMgPD0gJzknKSkKKwkgICAgZ290byBub19wbHVyYWw7CisjaWYgZGVmaW5lZCBIQVZFX1NUUlRPVUwgfHwgZGVmaW5lZCBfTElCQworCSAgbiA9IHN0cnRvdWwgKG5wbHVyYWxzLCAmZW5kcCwgMTApOworI2Vsc2UKKwkgIGZvciAoZW5kcCA9IG5wbHVyYWxzLCBuID0gMDsgKmVuZHAgPj0gJzAnICYmICplbmRwIDw9ICc5JzsgZW5kcCsrKQorCSAgICBuID0gbiAqIDEwICsgKCplbmRwIC0gJzAnKTsKKyNlbmRpZgorCSAgaWYgKG5wbHVyYWxzID09IGVuZHApCisJICAgIGdvdG8gbm9fcGx1cmFsOworCSAgKm5wbHVyYWxzcCA9IG47CisKKwkgIC8qIER1ZSB0byB0aGUgcmVzdHJpY3Rpb25zIGJpc29uIGltcG9zZXMgb250byB0aGUgaW50ZXJmYWNlIG9mIHRoZQorCSAgICAgc2Nhbm5lciBmdW5jdGlvbiB3ZSBoYXZlIHRvIHB1dCB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgcmVzdWx0CisJICAgICBwYXNzZWQgdXAgZnJvbSB0aGUgcGFyc2VyIGludG8gdGhlIHNhbWUgc3RydWN0dXJlIHdoaWNoIGFkZHJlc3MKKwkgICAgIGlzIHBhc3NlZCBkb3duIHRvIHRoZSBwYXJzZXIuICAqLworCSAgcGx1cmFsICs9IDc7CisJICBhcmdzLmNwID0gcGx1cmFsOworCSAgaWYgKFBMVVJBTF9QQVJTRSAoJmFyZ3MpICE9IDApCisJICAgIGdvdG8gbm9fcGx1cmFsOworCSAgKnBsdXJhbHAgPSBhcmdzLnJlczsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQnkgZGVmYXVsdCB3ZSBhcmUgdXNpbmcgdGhlIEdlcm1hbmljIGZvcm06IHNpbmd1bGFyIGZvcm0gb25seQorICAgICAgICAgZm9yIGBvbmUnLCB0aGUgcGx1cmFsIGZvcm0gb3RoZXJ3aXNlLiAgWWVzLCB0aGlzIGlzIGFsc28gd2hhdAorICAgICAgICAgRW5nbGlzaCBpcyB1c2luZyBzaW5jZSBFbmdsaXNoIGlzIGEgR2VybWFuaWMgbGFuZ3VhZ2UuICAqLworICAgIG5vX3BsdXJhbDoKKyAgICAgIElOSVRfR0VSTUFOSUNfUExVUkFMICgpOworICAgICAgKnBsdXJhbHAgPSAmR0VSTUFOSUNfUExVUkFMOworICAgICAgKm5wbHVyYWxzcCA9IDI7CisgICAgfQorfQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcGx1cmFsLWV4cC5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvcGx1cmFsLWV4cC5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNTg0NzEzMjgwIC0wNDAwCkBAIC0wLDAgKzEsMTE4IEBACisvKiBFeHByZXNzaW9uIHBhcnNpbmcgYW5kIGV2YWx1YXRpb24gZm9yIHBsdXJhbCBmb3JtIHNlbGVjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMjAwMC4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1BMVVJBTF9FWFBfSAorI2RlZmluZSBfUExVUkFMX0VYUF9ICisKKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisjZW5kaWYKKworI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCisjIGRlZmluZSBhdHRyaWJ1dGVfaGlkZGVuCisjZW5kaWYKKworCisvKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHRoZQorICAgcGx1cmFsIGZvcm0uICAqLworc3RydWN0IGV4cHJlc3Npb24KK3sKKyAgaW50IG5hcmdzOwkJCS8qIE51bWJlciBvZiBhcmd1bWVudHMuICAqLworICBlbnVtIG9wZXJhdG9yCisgIHsKKyAgICAvKiBXaXRob3V0IGFyZ3VtZW50czogICovCisgICAgdmFyLAkJCS8qIFRoZSB2YXJpYWJsZSAibiIuICAqLworICAgIG51bSwJCQkvKiBEZWNpbWFsIG51bWJlci4gICovCisgICAgLyogVW5hcnkgb3BlcmF0b3JzOiAgKi8KKyAgICBsbm90LAkJCS8qIExvZ2ljYWwgTk9ULiAgKi8KKyAgICAvKiBCaW5hcnkgb3BlcmF0b3JzOiAgKi8KKyAgICBtdWx0LAkJCS8qIE11bHRpcGxpY2F0aW9uLiAgKi8KKyAgICBkaXZpZGUsCQkJLyogRGl2aXNpb24uICAqLworICAgIG1vZHVsZSwJCQkvKiBNb2R1bG8gb3BlcmF0aW9uLiAgKi8KKyAgICBwbHVzLAkJCS8qIEFkZGl0aW9uLiAgKi8KKyAgICBtaW51cywJCQkvKiBTdWJ0cmFjdGlvbi4gICovCisgICAgbGVzc190aGFuLAkJCS8qIENvbXBhcmlzb24uICAqLworICAgIGdyZWF0ZXJfdGhhbiwJCS8qIENvbXBhcmlzb24uICAqLworICAgIGxlc3Nfb3JfZXF1YWwsCQkvKiBDb21wYXJpc29uLiAgKi8KKyAgICBncmVhdGVyX29yX2VxdWFsLAkJLyogQ29tcGFyaXNvbi4gICovCisgICAgZXF1YWwsCQkJLyogQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkuICAqLworICAgIG5vdF9lcXVhbCwJCQkvKiBDb21wYXJpc29uIGZvciBpbmVxdWFsaXR5LiAgKi8KKyAgICBsYW5kLAkJCS8qIExvZ2ljYWwgQU5ELiAgKi8KKyAgICBsb3IsCQkJLyogTG9naWNhbCBPUi4gICovCisgICAgLyogVGVybmFyeSBvcGVyYXRvcnM6ICAqLworICAgIHFtb3AJCQkvKiBRdWVzdGlvbiBtYXJrIG9wZXJhdG9yLiAgKi8KKyAgfSBvcGVyYXRpb247CisgIHVuaW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBudW07CS8qIE51bWJlciB2YWx1ZSBmb3IgYG51bScuICAqLworICAgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzNdOwkvKiBVcCB0byB0aHJlZSBhcmd1bWVudHMuICAqLworICB9IHZhbDsKK307CisKKy8qIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIHBhcnNlciBhbmQgZ2V0CisgICB0aGUgcmVzdWx0IGluIGEgdGhyZWFkLXNhZmUgd2F5LiAgKi8KK3N0cnVjdCBwYXJzZV9hcmdzCit7CisgIGNvbnN0IGNoYXIgKmNwOworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmVzOworfTsKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGlzIHNvdXJjZSBjb2RlIGlzIHVzZWQKKyAgIDEuIGluIHRoZSBHTlUgQyBMaWJyYXJ5IGxpYnJhcnksCisgICAyLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSwKKyAgIDMuIGluIHRoZSBHTlUgZ2V0dGV4dCB0b29scy4KKyAgIFRoZSBmdW5jdGlvbiBuYW1lcyBpbiBlYWNoIHNpdHVhdGlvbiBtdXN0IGJlIGRpZmZlcmVudCwgdG8gYWxsb3cgZm9yCisgICBiaW5hcnkgaW5jb21wYXRpYmxlIGNoYW5nZXMgaW4gJ3N0cnVjdCBleHByZXNzaW9uJy4gIEZ1cnRoZXJtb3JlLAorICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwgdGhlIG5hbWVzIGhhdmUgYSBfXyBwcmVmaXgsCisgICAyLiszLiBpbiB0aGUgR05VIGxpYmludGwgbGlicmFyeSBhbmQgaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLCB0aGUgbmFtZXMKKyAgICAgICAgIG11c3QgZm9sbG93IEFOU0kgQyBhbmQgbm90IHN0YXJ0IHdpdGggX18uCisgICBTbyB3ZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIHRoZSB0aHJlZSBjYXNlcy4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBfX2dldHRleHRfZnJlZV9leHAKKyMgZGVmaW5lIFBMVVJBTF9QQVJTRSBfX2dldHRleHRwYXJzZQorIyBkZWZpbmUgR0VSTUFOSUNfUExVUkFMIF9fZ2V0dGV4dF9nZXJtYW5pY19wbHVyYWwKKyMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gX19nZXR0ZXh0X2V4dHJhY3RfcGx1cmFsCisjZWxpZiBkZWZpbmVkIChJTl9MSUJJTlRMKQorIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9mcmVlX2V4cAorIyBkZWZpbmUgUExVUkFMX1BBUlNFIGxpYmludGxfZ2V0dGV4dHBhcnNlCisjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgbGliaW50bF9nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAorIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBsaWJpbnRsX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKKyNlbHNlCisjIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gZnJlZV9wbHVyYWxfZXhwcmVzc2lvbgorIyBkZWZpbmUgUExVUkFMX1BBUlNFIHBhcnNlX3BsdXJhbF9leHByZXNzaW9uCisjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgZ2VybWFuaWNfcGx1cmFsCisjIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGV4dHJhY3RfcGx1cmFsX2V4cHJlc3Npb24KKyNlbmRpZgorCitleHRlcm4gdm9pZCBGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworZXh0ZXJuIGludCBQTFVSQUxfUEFSU0UgKHZvaWQgKmFyZyk7CitleHRlcm4gc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gdm9pZCBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIChjb25zdCBjaGFyICpudWxsZW50cnksCisJCQkJICAgICAgIHN0cnVjdCBleHByZXNzaW9uICoqcGx1cmFscCwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgKm5wbHVyYWxzcCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CisKKyNpZiAhZGVmaW5lZCAoX0xJQkMpICYmICFkZWZpbmVkIChJTl9MSUJJTlRMKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHBsdXJhbF9ldmFsIChzdHJ1Y3QgZXhwcmVzc2lvbiAqcGV4cCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGludCBuKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX1BMVVJBTF9FWFBfSCAqLwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcGx1cmFsLnkJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9wbHVyYWwueQkyMDA0LTA5LTEyIDE0OjQwOjM0LjU4OTcxMjUyMCAtMDQwMApAQCAtMCwwICsxLDM4MSBAQAorJXsKKy8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzZXIgdXNlcyBhbGxvY2EuICBBSVggMyBmb3JjZXMgdXMgdG8gcHV0IHRoaXMKKyAgIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4gYmlzb24ncworICAgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+CisgICBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUgYXJiaXRyYXJ5IHN5c3RlbSBoZWFkZXJzLiAgKi8KKyNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KKyAjcHJhZ21hIGFsbG9jYQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisKKy8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKKyAgIGJ1dCB3ZSB3YW50IGl0IHRvIGJlIGNhbGxlZCBQTFVSQUxfUEFSU0UuICAqLworI2lmbmRlZiBfTElCQworIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCisjZW5kaWYKKworI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAorI2RlZmluZSBZWVBBUlNFX1BBUkFNCWFyZworJX0KKyVwdXJlX3BhcnNlcgorJWV4cGVjdCA3CisKKyV1bmlvbiB7CisgIHVuc2lnbmVkIGxvbmcgaW50IG51bTsKKyAgZW51bSBvcGVyYXRvciBvcDsKKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKK30KKworJXsKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgaW50IHl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCk7CitzdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOworCisvKiBBbGxvY2F0aW9uIG9mIGV4cHJlc3Npb25zLiAgKi8KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHAgKGludCBuYXJncywgZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOworCisgIC8qIElmIGFueSBvZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIG1hbGxvYydlZCwganVzdCByZXR1cm4gTlVMTC4gICovCisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKKyAgICAgIGdvdG8gZmFpbDsKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KKyAgbmV3cCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsKKyAgaWYgKG5ld3AgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXdwLT5uYXJncyA9IG5hcmdzOworICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7CisgICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorCW5ld3AtPnZhbC5hcmdzW2ldID0gYXJnc1tpXTsKKyAgICAgIHJldHVybiBuZXdwOworICAgIH0KKworIGZhaWw6CisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgRlJFRV9FWFBSRVNTSU9OIChhcmdzW2ldKTsKKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzAgKGVudW0gb3BlcmF0b3Igb3ApCit7CisgIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8xIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCit7CisgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzFdOworCisgIGFyZ3NbMF0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDEsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMiAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmxlZnQsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07CisKKyAgYXJnc1swXSA9IGxlZnQ7CisgIGFyZ3NbMV0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDIsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzMgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpiZXhwLAorCSAgIHN0cnVjdCBleHByZXNzaW9uICp0YnJhbmNoLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZmJyYW5jaCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107CisKKyAgYXJnc1swXSA9IGJleHA7CisgIGFyZ3NbMV0gPSB0YnJhbmNoOworICBhcmdzWzJdID0gZmJyYW5jaDsKKyAgcmV0dXJuIG5ld19leHAgKDMsIG9wLCBhcmdzKTsKK30KKworJX0KKworLyogVGhpcyBkZWNsYXJlcyB0aGF0IGFsbCBvcGVyYXRvcnMgaGF2ZSB0aGUgc2FtZSBhc3NvY2lhdGl2aXR5IGFuZCB0aGUKKyAgIHByZWNlZGVuY2Ugb3JkZXIgYXMgaW4gQy4gIFNlZSBbSGFyYmlzb24sIFN0ZWVsZTogQywgQSBSZWZlcmVuY2UgTWFudWFsXS4KKyAgIFRoZXJlIGlzIG5vIHVuYXJ5IG1pbnVzIGFuZCBubyBiaXR3aXNlIG9wZXJhdG9ycy4KKyAgIE9wZXJhdG9ycyB3aXRoIHRoZSBzYW1lIHN5bnRhY3RpYyBiZWhhdmlvdXIgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlCisgICB0b2tlbiwgdG8gc2F2ZSBzcGFjZSBpbiB0aGUgYXJyYXkgZ2VuZXJhdGVkIGJ5IGJpc29uLiAgKi8KKyVyaWdodCAnPycJCS8qICAgPwkJKi8KKyVsZWZ0ICd8JwkJLyogICB8fAkJKi8KKyVsZWZ0ICcmJwkJLyogICAmJgkJKi8KKyVsZWZ0IEVRVU9QMgkJLyogICA9PSAhPQkqLworJWxlZnQgQ01QT1AyCQkvKiAgIDwgPiA8PSA+PQkqLworJWxlZnQgQURET1AyCQkvKiAgICsgLQkqLworJWxlZnQgTVVMT1AyCQkvKiAgICogLyAlCSovCislcmlnaHQgJyEnCQkvKiAgICEJCSovCisKKyV0b2tlbiA8b3A+IEVRVU9QMiBDTVBPUDIgQURET1AyIE1VTE9QMgorJXRva2VuIDxudW0+IE5VTUJFUgorJXR5cGUgPGV4cD4gZXhwCisKKyUlCisKK3N0YXJ0OgkgIGV4cAorCSAgeworCSAgICBpZiAoJDEgPT0gTlVMTCkKKwkgICAgICBZWUFCT1JUOworCSAgICAoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPnJlcyA9ICQxOworCSAgfQorCTsKKworZXhwOgkgIGV4cCAnPycgZXhwICc6JyBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzMgKHFtb3AsICQxLCAkMywgJDUpOworCSAgfQorCXwgZXhwICd8JyBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKGxvciwgJDEsICQzKTsKKwkgIH0KKwl8IGV4cCAnJicgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8yIChsYW5kLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIEVRVU9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIENNUE9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIEFERE9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIE1VTE9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgJyEnIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMSAobG5vdCwgJDIpOworCSAgfQorCXwgJ24nCisJICB7CisJICAgICQkID0gbmV3X2V4cF8wICh2YXIpOworCSAgfQorCXwgTlVNQkVSCisJICB7CisJICAgIGlmICgoJCQgPSBuZXdfZXhwXzAgKG51bSkpICE9IE5VTEwpCisJICAgICAgJCQtPnZhbC5udW0gPSAkMTsKKwkgIH0KKwl8ICcoJyBleHAgJyknCisJICB7CisJICAgICQkID0gJDI7CisJICB9CisJOworCislJQorCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQoreworICBpZiAoZXhwID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLworICBzd2l0Y2ggKGV4cC0+bmFyZ3MpCisgICAgeworICAgIGNhc2UgMzoKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1syXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgMjoKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1sxXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgMToKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1swXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgZnJlZSAoZXhwKTsKK30KKworCitzdGF0aWMgaW50Cit5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCit7CisgIGNvbnN0IGNoYXIgKmV4cCA9ICpwZXhwOworICBpbnQgcmVzdWx0OworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChleHBbMF0gPT0gJ1wwJykKKwl7CisJICAqcGV4cCA9IGV4cDsKKwkgIHJldHVybiBZWUVPRjsKKwl9CisKKyAgICAgIGlmIChleHBbMF0gIT0gJyAnICYmIGV4cFswXSAhPSAnXHQnKQorCWJyZWFrOworCisgICAgICArK2V4cDsKKyAgICB9CisKKyAgcmVzdWx0ID0gKmV4cCsrOworICBzd2l0Y2ggKHJlc3VsdCkKKyAgICB7CisgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIGludCBuID0gcmVzdWx0IC0gJzAnOworCXdoaWxlIChleHBbMF0gPj0gJzAnICYmIGV4cFswXSA8PSAnOScpCisJICB7CisJICAgIG4gKj0gMTA7CisJICAgIG4gKz0gZXhwWzBdIC0gJzAnOworCSAgICArK2V4cDsKKwkgIH0KKwlsdmFsLT5udW0gPSBuOworCXJlc3VsdCA9IE5VTUJFUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPSc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gZXF1YWw7CisJICByZXN1bHQgPSBFUVVPUDI7CisJfQorICAgICAgZWxzZQorCXJlc3VsdCA9IFlZRVJSQ09ERTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnISc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gbm90X2VxdWFsOworCSAgcmVzdWx0ID0gRVFVT1AyOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJic6CisgICAgY2FzZSAnfCc6CisgICAgICBpZiAoZXhwWzBdID09IHJlc3VsdCkKKwkrK2V4cDsKKyAgICAgIGVsc2UKKwlyZXN1bHQgPSBZWUVSUkNPREU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7CisJfQorICAgICAgZWxzZQorCWx2YWwtPm9wID0gbGVzc190aGFuOworICAgICAgcmVzdWx0ID0gQ01QT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBncmVhdGVyX29yX2VxdWFsOworCX0KKyAgICAgIGVsc2UKKwlsdmFsLT5vcCA9IGdyZWF0ZXJfdGhhbjsKKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKic6CisgICAgICBsdmFsLT5vcCA9IG11bHQ7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy8nOgorICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyUnOgorICAgICAgbHZhbC0+b3AgPSBtb2R1bGU7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJysnOgorICAgICAgbHZhbC0+b3AgPSBwbHVzOworICAgICAgcmVzdWx0ID0gQURET1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICctJzoKKyAgICAgIGx2YWwtPm9wID0gbWludXM7CisgICAgICByZXN1bHQgPSBBRERPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ24nOgorICAgIGNhc2UgJz8nOgorICAgIGNhc2UgJzonOgorICAgIGNhc2UgJygnOgorICAgIGNhc2UgJyknOgorICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgJzsnOgorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdcMCc6CisgICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KKyAgICAgIC0tZXhwOworICAgICAgcmVzdWx0ID0gWVlFT0Y7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSBZWUVSUkNPREU7CisjaWYgWVlERUJVRyAhPSAwCisgICAgICAtLWV4cDsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorCisgICpwZXhwID0gZXhwOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQKK3l5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgLyogRG8gbm90aGluZy4gIFdlIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUuICAqLworfQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcG8ydGJsLnNlZC5pbgkxOTk4LTA0LTI2IDA5OjIwOjUyLjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL3BvMnRibC5zZWQuaW4JMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKQEAgLTEsMTAyICswLDAgQEAKLSMgcG8ydGJsLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gbG9va3VwIHRhYmxlIGZvciBjYXRnZXRzCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotMSB7Ci0gIGlcCi0vKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBwbzJ0Ymwuc2VkIGZyb20gQFBBQ0tBR0UgTkFNRUAucG90LiAgKi9cCi1cCi0jaWYgSEFWRV9DT05GSUdfSFwKLSMgaW5jbHVkZSA8Y29uZmlnLmg+XAotI2VuZGlmXAotXAotI2luY2x1ZGUgImxpYmdldHRleHQuaCJcCi1cCi1jb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXSA9IHsKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV3JpdGUgbXNnaWQgZW50cmllcyBpbiBDIGFycmF5IGZvcm0uCi0jCi0vXm1zZ2lkLyB7Ci0gIHMvbXNnaWRbIAldKlwoIi4qIlwpLyAge1wxLwotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZQotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXCkiXChcblwpIlwoLioiXCkvXDFcMlwzLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotIyBCZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBmaWxlIGNvcnJlY3RseSBmb3JtZWQgdGhlIGxpbmUKLSMganVzdCByZWFkIGNhbm5vdCBiZSBhZ2FpbiBiZSBhIG1zZ2lkIGxpbmUuICBTbyBpdCdzIHNhZmUgdG8gaWdub3JlCi0jIGl0LgotICBzL1woLipcKVxuLiovXDEvCi0gIGJjCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0jIFNvbWUgYnVnZ3kgc2VkcyBkbyBub3QgY2xlYXIgdGhlIGBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbiBzaW5jZSBsYXN0IGBgdCcnJwotIyBmbGFnIG9uIGBOJywgc28gd2UgZG8gYSBgdCcgaGVyZSB0byBjbGVhciBpdC4KLSAgdGIKLSMgTm90IHJlYWNoZWQKLSAgOmMKLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSAgRwotICBzL1woLipcKVxuXChbMC05XSpcKS9cMSwgXDJ9LC8KLSAgcy9cKC4qXCkiJC9cMS8KLSAgcAotfQotIwotIyBMYXN0IGxpbmUuCi0jCi0kIHsKLSAgaVwKLX07XAotCi0gIGcKLSAgcy8wKlwoLipcKS9pbnQgX21zZ190YmxfbGVuZ3RoID0gXDE7L3AKLX0KLWQKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3ByaW50Zi1hcmdzLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9wcmludGYtYXJncy5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNTk1NzExNjA4IC0wNDAwCkBAIC0wLDAgKzEsMTE5IEBACisvKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKyNpbmNsdWRlICJwcmludGYtYXJncy5oIgorCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbmRpZgoraW50CitwcmludGZfZmV0Y2hhcmdzICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSkKK3sKKyAgc2l6ZV90IGk7CisgIGFyZ3VtZW50ICphcDsKKworICBmb3IgKGkgPSAwLCBhcCA9ICZhLT5hcmdbMF07IGkgPCBhLT5jb3VudDsgaSsrLCBhcCsrKQorICAgIHN3aXRjaCAoYXAtPnR5cGUpCisgICAgICB7CisgICAgICBjYXNlIFRZUEVfU0NIQVI6CisJYXAtPmEuYV9zY2hhciA9IHZhX2FyZyAoYXJncywgLypzaWduZWQgY2hhciovIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfVUNIQVI6CisJYXAtPmEuYV91Y2hhciA9IHZhX2FyZyAoYXJncywgLyp1bnNpZ25lZCBjaGFyKi8gaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9TSE9SVDoKKwlhcC0+YS5hX3Nob3J0ID0gdmFfYXJnIChhcmdzLCAvKnNob3J0Ki8gaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VU0hPUlQ6CisJYXAtPmEuYV91c2hvcnQgPSB2YV9hcmcgKGFyZ3MsIC8qdW5zaWduZWQgc2hvcnQqLyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0lOVDoKKwlhcC0+YS5hX2ludCA9IHZhX2FyZyAoYXJncywgaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VSU5UOgorCWFwLT5hLmFfdWludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9MT05HSU5UOgorCWFwLT5hLmFfbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1VMT05HSU5UOgorCWFwLT5hLmFfdWxvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIHVuc2lnbmVkIGxvbmcgaW50KTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgICAgY2FzZSBUWVBFX0xPTkdMT05HSU5UOgorCWFwLT5hLmFfbG9uZ2xvbmdpbnQgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKKwlhcC0+YS5hX3Vsb25nbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBsb25nIGludCk7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGNhc2UgVFlQRV9ET1VCTEU6CisJYXAtPmEuYV9kb3VibGUgPSB2YV9hcmcgKGFyZ3MsIGRvdWJsZSk7CisJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorICAgICAgY2FzZSBUWVBFX0xPTkdET1VCTEU6CisJYXAtPmEuYV9sb25nZG91YmxlID0gdmFfYXJnIChhcmdzLCBsb25nIGRvdWJsZSk7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGNhc2UgVFlQRV9DSEFSOgorCWFwLT5hLmFfY2hhciA9IHZhX2FyZyAoYXJncywgaW50KTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX1dJTlRfVAorICAgICAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKKwlhcC0+YS5hX3dpZGVfY2hhciA9IHZhX2FyZyAoYXJncywgd2ludF90KTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSBUWVBFX1NUUklORzoKKwlhcC0+YS5hX3N0cmluZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKyAgICAgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKKwlhcC0+YS5hX3dpZGVfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCB3Y2hhcl90ICopOworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIFRZUEVfUE9JTlRFUjoKKwlhcC0+YS5hX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHZvaWQgKik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUjoKKwlhcC0+YS5hX2NvdW50X3NjaGFyX3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHNpZ25lZCBjaGFyICopOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6CisJYXAtPmEuYV9jb3VudF9zaG9ydF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBzaG9ydCAqKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjoKKwlhcC0+YS5hX2NvdW50X2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBpbnQgKik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOgorCWFwLT5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGludCAqKTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgICAgY2FzZSBUWVBFX0NPVU5UX0xPTkdMT05HSU5UX1BPSU5URVI6CisJYXAtPmEuYV9jb3VudF9sb25nbG9uZ2ludF9wb2ludGVyID0gdmFfYXJnIChhcmdzLCBsb25nIGxvbmcgaW50ICopOworCWJyZWFrOworI2VuZGlmCisgICAgICBkZWZhdWx0OgorCS8qIFVua25vd24gdHlwZS4gICovCisJcmV0dXJuIC0xOworICAgICAgfQorICByZXR1cm4gMDsKK30KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3ByaW50Zi1hcmdzLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9wcmludGYtYXJncy5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjAxNzEwNjk2IC0wNDAwCkBAIC0wLDAgKzEsMTM3IEBACisvKiBEZWNvbXBvc2VkIHByaW50ZiBhcmd1bWVudCBsaXN0LgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9QUklOVEZfQVJHU19ICisjZGVmaW5lIF9QUklOVEZfQVJHU19ICisKKy8qIEdldCBzaXplX3QuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgd2NoYXJfdC4gICovCisjaWZkZWYgSEFWRV9XQ0hBUl9UCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKy8qIEdldCB3aW50X3QuICAqLworI2lmZGVmIEhBVkVfV0lOVF9UCisjIGluY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYKKworLyogR2V0IHZhX2xpc3QuICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKy8qIEFyZ3VtZW50IHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVFlQRV9OT05FLAorICBUWVBFX1NDSEFSLAorICBUWVBFX1VDSEFSLAorICBUWVBFX1NIT1JULAorICBUWVBFX1VTSE9SVCwKKyAgVFlQRV9JTlQsCisgIFRZUEVfVUlOVCwKKyAgVFlQRV9MT05HSU5ULAorICBUWVBFX1VMT05HSU5ULAorI2lmZGVmIEhBVkVfTE9OR19MT05HCisgIFRZUEVfTE9OR0xPTkdJTlQsCisgIFRZUEVfVUxPTkdMT05HSU5ULAorI2VuZGlmCisgIFRZUEVfRE9VQkxFLAorI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKyAgVFlQRV9MT05HRE9VQkxFLAorI2VuZGlmCisgIFRZUEVfQ0hBUiwKKyNpZmRlZiBIQVZFX1dJTlRfVAorICBUWVBFX1dJREVfQ0hBUiwKKyNlbmRpZgorICBUWVBFX1NUUklORywKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKyAgVFlQRV9XSURFX1NUUklORywKKyNlbmRpZgorICBUWVBFX1BPSU5URVIsCisgIFRZUEVfQ09VTlRfU0NIQVJfUE9JTlRFUiwKKyAgVFlQRV9DT1VOVF9TSE9SVF9QT0lOVEVSLAorICBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSLAorICBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUgorI2lmZGVmIEhBVkVfTE9OR19MT05HCissIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUgorI2VuZGlmCit9IGFyZ190eXBlOworCisvKiBQb2x5bW9ycGhpYyBhcmd1bWVudCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgYXJnX3R5cGUgdHlwZTsKKyAgdW5pb24KKyAgeworICAgIHNpZ25lZCBjaGFyCQkJYV9zY2hhcjsKKyAgICB1bnNpZ25lZCBjaGFyCQlhX3VjaGFyOworICAgIHNob3J0CQkJYV9zaG9ydDsKKyAgICB1bnNpZ25lZCBzaG9ydAkJYV91c2hvcnQ7CisgICAgaW50CQkJCWFfaW50OworICAgIHVuc2lnbmVkIGludAkJYV91aW50OworICAgIGxvbmcgaW50CQkJYV9sb25naW50OworICAgIHVuc2lnbmVkIGxvbmcgaW50CQlhX3Vsb25naW50OworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgbG9uZyBsb25nIGludAkJYV9sb25nbG9uZ2ludDsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50CWFfdWxvbmdsb25naW50OworI2VuZGlmCisgICAgZmxvYXQJCQlhX2Zsb2F0OworICAgIGRvdWJsZQkJCWFfZG91YmxlOworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKyAgICBsb25nIGRvdWJsZQkJCWFfbG9uZ2RvdWJsZTsKKyNlbmRpZgorICAgIGludAkJCQlhX2NoYXI7CisjaWZkZWYgSEFWRV9XSU5UX1QKKyAgICB3aW50X3QJCQlhX3dpZGVfY2hhcjsKKyNlbmRpZgorICAgIGNvbnN0IGNoYXIqCQkJYV9zdHJpbmc7CisjaWZkZWYgSEFWRV9XQ0hBUl9UCisgICAgY29uc3Qgd2NoYXJfdCoJCWFfd2lkZV9zdHJpbmc7CisjZW5kaWYKKyAgICB2b2lkKgkJCWFfcG9pbnRlcjsKKyAgICBzaWduZWQgY2hhciAqCQlhX2NvdW50X3NjaGFyX3BvaW50ZXI7CisgICAgc2hvcnQgKgkJCWFfY291bnRfc2hvcnRfcG9pbnRlcjsKKyAgICBpbnQgKgkJCWFfY291bnRfaW50X3BvaW50ZXI7CisgICAgbG9uZyBpbnQgKgkJCWFfY291bnRfbG9uZ2ludF9wb2ludGVyOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgbG9uZyBsb25nIGludCAqCQlhX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXI7CisjZW5kaWYKKyAgfQorICBhOworfQorYXJndW1lbnQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHNpemVfdCBjb3VudDsKKyAgYXJndW1lbnQgKmFyZzsKK30KK2FyZ3VtZW50czsKKworCisvKiBGZXRjaCB0aGUgYXJndW1lbnRzLCBwdXR0aW5nIHRoZW0gaW50byBhLiAqLworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZWxzZQorZXh0ZXJuCisjZW5kaWYKK2ludCBwcmludGZfZmV0Y2hhcmdzICh2YV9saXN0IGFyZ3MsIGFyZ3VtZW50cyAqYSk7CisKKyNlbmRpZiAvKiBfUFJJTlRGX0FSR1NfSCAqLwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcHJpbnRmLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9wcmludGYuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjYwNzcwOTc4NCAtMDQwMApAQCAtMCwwICsxLDM3MSBAQAorLyogRm9ybWF0dGVkIG91dHB1dCB0byBzdHJpbmdzLCB1c2luZyBQT1NJWC9YU0kgZm9ybWF0IHN0cmluZ3Mgd2l0aCBwb3NpdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyMgZGVmaW5lIEhBVkVfQUxMT0NBIDEKKyNlbHNlCisjIGlmZGVmIF9NU0NfVkVSCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQorIyBlbHNlCisjICBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQworIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgorIyAgZWxzZQorIyAgIGlmZGVmIF9BSVgKKyAjcHJhZ21hIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIGFsbG9jYQorY2hhciAqYWxsb2NhICgpOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWYgIUhBVkVfUE9TSVhfUFJJTlRGCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQorICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKKyAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKKyMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbHNlCisjIGRlZmluZSBETExfRVhQT1JURUQKKyNlbmRpZgorCisjZGVmaW5lIFNUQVRJQyBzdGF0aWMKKworLyogRGVmaW5lIGF1eGlsaWFyeSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInByaW50Zi1hcmdzLmgiLiAgKi8KKyNpbmNsdWRlICJwcmludGYtYXJncy5jIgorCisvKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAicHJpbnRmLXBhcnNlLmgiLiAgKi8KKyNpbmNsdWRlICJwcmludGYtcGFyc2UuYyIKKworLyogRGVmaW5lIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAidmFzbnByaW50Zi5oIi4gICovCisjZGVmaW5lIHZhc25wcmludGYgbGliaW50bF92YXNucHJpbnRmCisjaW5jbHVkZSAidmFzbnByaW50Zi5jIgorI2lmIDAgLyogbm90IG5lZWRlZCAqLworI2RlZmluZSBhc25wcmludGYgbGliaW50bF9hc25wcmludGYKKyNpbmNsdWRlICJhc25wcmludGYuYyIKKyNlbmRpZgorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92ZnByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaWYgKHN0cmNociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisgICAgcmV0dXJuIHZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgbGVuZ3RoOworICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaW50IHJldHZhbCA9IC0xOworICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQorCXsKKwkgIGlmIChmd3JpdGUgKHJlc3VsdCwgMSwgbGVuZ3RoLCBzdHJlYW0pID09IGxlbmd0aCkKKwkgICAgcmV0dmFsID0gbGVuZ3RoOworCSAgZnJlZSAocmVzdWx0KTsKKwl9CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfZnByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3ZmcHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ZwcmludGYgKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICByZXR1cm4gbGliaW50bF92ZnByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9wcmludGYgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdnByaW50ZiAoZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdnNwcmludGYgKGNoYXIgKnJlc3VsdGJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIGlmIChzdHJjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorICAgIHJldHVybiB2c3ByaW50ZiAocmVzdWx0YnVmLCBmb3JtYXQsIGFyZ3MpOworICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IGxlbmd0aCA9IChzaXplX3QpIH4wIC8gKDQgKiBzaXplb2YgKGNoYXIpKTsKKyAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAocmVzdWx0YnVmLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICAgICAgaWYgKHJlc3VsdCAhPSByZXN1bHRidWYpCisJeworCSAgZnJlZSAocmVzdWx0KTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIGxlbmd0aDsKKyAgICB9Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3NwcmludGYgKGNoYXIgKnJlc3VsdGJ1ZiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92c3ByaW50ZiAocmVzdWx0YnVmLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisjaWYgSEFWRV9TTlBSSU5URgorCisjIGlmIEhBVkVfREVDTF9fU05QUklOVEYKKyAgIC8qIFdpbmRvd3MuICAqLworIyAgZGVmaW5lIHN5c3RlbV92c25wcmludGYgX3ZzbnByaW50ZgorIyBlbHNlCisgICAvKiBVbml4LiAgKi8KKyMgIGRlZmluZSBzeXN0ZW1fdnNucHJpbnRmIHZzbnByaW50ZgorIyBlbmRpZgorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92c25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIGlmIChzdHJjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorICAgIHJldHVybiBzeXN0ZW1fdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7CisgICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQorCXsKKwkgIGlmIChtYXhsZW5ndGggPiAwKQorCSAgICB7CisJICAgICAgaWYgKGxlbmd0aCA8IG1heGxlbmd0aCkKKwkJYWJvcnQgKCk7CisJICAgICAgbWVtY3B5IChyZXN1bHRidWYsIHJlc3VsdCwgbWF4bGVuZ3RoIC0gMSk7CisJICAgICAgcmVzdWx0YnVmW21heGxlbmd0aCAtIDFdID0gJ1wwJzsKKwkgICAgfQorCSAgZnJlZSAocmVzdWx0KTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIGxlbmd0aDsKKyAgICB9Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3NucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdnNucHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmCisKKyNpZiBIQVZFX0FTUFJJTlRGCisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3Zhc3ByaW50ZiAoY2hhciAqKnJlc3VsdHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBzaXplX3QgbGVuZ3RoOworICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisgICpyZXN1bHRwID0gcmVzdWx0OworICByZXR1cm4gbGVuZ3RoOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9hc3ByaW50ZiAoY2hhciAqKnJlc3VsdHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdmFzcHJpbnRmIChyZXN1bHRwLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYKKworI2lmIEhBVkVfRldQUklOVEYKKworI2luY2x1ZGUgPHdjaGFyLmg+CisKKyNkZWZpbmUgV0lERV9DSEFSX1ZFUlNJT04gMQorCisvKiBEZWZpbmUgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAid3ByaW50Zi1wYXJzZS5oIi4gICovCisjaW5jbHVkZSAicHJpbnRmLXBhcnNlLmMiCisKKy8qIERlZmluZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInZhc25wcmludGYuaCIuICAqLworI2RlZmluZSB2YXNud3ByaW50ZiBsaWJpbnRsX3Zhc253cHJpbnRmCisjaW5jbHVkZSAidmFzbnByaW50Zi5jIgorI2lmIDAgLyogbm90IG5lZWRlZCAqLworI2RlZmluZSBhc253cHJpbnRmIGxpYmludGxfYXNud3ByaW50ZgorI2luY2x1ZGUgImFzbnByaW50Zi5jIgorI2VuZGlmCisKKyMgaWYgSEFWRV9ERUNMX19TTldQUklOVEYKKyAgIC8qIFdpbmRvd3MuICAqLworIyAgZGVmaW5lIHN5c3RlbV92c3dwcmludGYgX3ZzbndwcmludGYKKyMgZWxzZQorICAgLyogVW5peC4gICovCisjICBkZWZpbmUgc3lzdGVtX3Zzd3ByaW50ZiB2c3dwcmludGYKKyMgZW5kaWYKKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdmZ3cHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAod2NzY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKyAgICByZXR1cm4gdmZ3cHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgbGVuZ3RoOworICAgICAgd2NoYXJfdCAqcmVzdWx0ID0gbGliaW50bF92YXNud3ByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgICAgIGludCByZXR2YWwgPSAtMTsKKyAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKwl7CisJICBzaXplX3QgaTsKKwkgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwkgICAgaWYgKGZwdXR3YyAocmVzdWx0W2ldLCBzdHJlYW0pID09IFdFT0YpCisJICAgICAgYnJlYWs7CisJICBpZiAoaSA9PSBsZW5ndGgpCisJICAgIHJldHZhbCA9IGxlbmd0aDsKKwkgIGZyZWUgKHJlc3VsdCk7CisJfQorICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX2Z3cHJpbnRmIChGSUxFICpzdHJlYW0sIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdmZ3cHJpbnRmIChzdHJlYW0sIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3Z3cHJpbnRmIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgcmV0dXJuIGxpYmludGxfdmZ3cHJpbnRmIChzdGRvdXQsIGZvcm1hdCwgYXJncyk7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3dwcmludGYgKGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdndwcmludGYgKGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3Zzd3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaWYgKHdjc2NociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisgICAgcmV0dXJuIHN5c3RlbV92c3dwcmludGYgKHJlc3VsdGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IG1heGxlbmd0aCA9IGxlbmd0aDsKKyAgICAgIHdjaGFyX3QgKnJlc3VsdCA9IGxpYmludGxfdmFzbndwcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQorCXsKKwkgIGlmIChtYXhsZW5ndGggPiAwKQorCSAgICB7CisJICAgICAgaWYgKGxlbmd0aCA8IG1heGxlbmd0aCkKKwkJYWJvcnQgKCk7CisJICAgICAgbWVtY3B5IChyZXN1bHRidWYsIHJlc3VsdCwgKG1heGxlbmd0aCAtIDEpICogc2l6ZW9mICh3Y2hhcl90KSk7CisJICAgICAgcmVzdWx0YnVmW21heGxlbmd0aCAtIDFdID0gMDsKKwkgICAgfQorCSAgZnJlZSAocmVzdWx0KTsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIGxlbmd0aDsKKyAgICB9Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3N3cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdnN3cHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmCisKKyNlbmRpZgotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcHJpbnRmLXBhcnNlLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9wcmludGYtcGFyc2UuYwkyMDA0LTA5LTEyIDE0OjQwOjM0LjYyMjcwNzUwNCAtMDQwMApAQCAtMCwwICsxLDUzNyBAQAorLyogRm9ybWF0dGVkIG91dHB1dCB0byBzdHJpbmdzLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAsIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKKyNlbHNlCisjIGluY2x1ZGUgInByaW50Zi1wYXJzZS5oIgorI2VuZGlmCisKKy8qIEdldCBzaXplX3QsIE5VTEwuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgaW50bWF4X3QuICAqLworI2lmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWYgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKy8qIG1hbGxvYygpLCByZWFsbG9jKCksIGZyZWUoKS4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCisjaW5jbHVkZSAieHNpemUuaCIKKworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGRlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQorIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKKyMgZGVmaW5lIERJUkVDVElWRSB3Y2hhcl90X2RpcmVjdGl2ZQorIyBkZWZpbmUgRElSRUNUSVZFUyB3Y2hhcl90X2RpcmVjdGl2ZXMKKyNlbHNlCisjIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCisjIGRlZmluZSBDSEFSX1QgY2hhcgorIyBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCisjIGRlZmluZSBESVJFQ1RJVkVTIGNoYXJfZGlyZWN0aXZlcworI2VuZGlmCisKKyNpZmRlZiBTVEFUSUMKK1NUQVRJQworI2VuZGlmCitpbnQKK1BSSU5URl9QQVJTRSAoY29uc3QgQ0hBUl9UICpmb3JtYXQsIERJUkVDVElWRVMgKmQsIGFyZ3VtZW50cyAqYSkKK3sKKyAgY29uc3QgQ0hBUl9UICpjcCA9IGZvcm1hdDsJCS8qIHBvaW50ZXIgaW50byBmb3JtYXQgKi8KKyAgc2l6ZV90IGFyZ19wb3NuID0gMDsJCS8qIG51bWJlciBvZiByZWd1bGFyIGFyZ3VtZW50cyBjb25zdW1lZCAqLworICBzaXplX3QgZF9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGQtPmRpciAqLworICBzaXplX3QgYV9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGEtPmFyZyAqLworICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aCA9IDA7CisgIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDA7CisKKyAgZC0+Y291bnQgPSAwOworICBkX2FsbG9jYXRlZCA9IDE7CisgIGQtPmRpciA9IG1hbGxvYyAoZF9hbGxvY2F0ZWQgKiBzaXplb2YgKERJUkVDVElWRSkpOworICBpZiAoZC0+ZGlyID09IE5VTEwpCisgICAgLyogT3V0IG9mIG1lbW9yeS4gICovCisgICAgcmV0dXJuIC0xOworCisgIGEtPmNvdW50ID0gMDsKKyAgYV9hbGxvY2F0ZWQgPSAwOworICBhLT5hcmcgPSBOVUxMOworCisjZGVmaW5lIFJFR0lTVEVSX0FSRyhfaW5kZXhfLF90eXBlXykgXAorICB7CQkJCQkJCQkJXAorICAgIHNpemVfdCBuID0gKF9pbmRleF8pOwkJCQkJCVwKKyAgICBpZiAobiA+PSBhX2FsbG9jYXRlZCkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQlcCisJYXJndW1lbnQgKm1lbW9yeTsJCQkJCQlcCisJCQkJCQkJCQlcCisJYV9hbGxvY2F0ZWQgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCAyKTsJCQkJXAorCWlmIChhX2FsbG9jYXRlZCA8PSBuKQkJCQkJCVwKKwkgIGFfYWxsb2NhdGVkID0geHN1bSAobiwgMSk7CQkJCQlcCisJbWVtb3J5X3NpemUgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCBzaXplb2YgKGFyZ3VtZW50KSk7CQlcCisJaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQkJCQlcCisJICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8JCQlcCisJICBnb3RvIGVycm9yOwkJCQkJCQlcCisJbWVtb3J5ID0gKGEtPmFyZwkJCQkJCVwKKwkJICA/IHJlYWxsb2MgKGEtPmFyZywgbWVtb3J5X3NpemUpCQkJXAorCQkgIDogbWFsbG9jIChtZW1vcnlfc2l6ZSkpOwkJCQlcCisJaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCVwKKwkgIC8qIE91dCBvZiBtZW1vcnkuICAqLwkJCQkJCVwKKwkgIGdvdG8gZXJyb3I7CQkJCQkJCVwKKwlhLT5hcmcgPSBtZW1vcnk7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICB3aGlsZSAoYS0+Y291bnQgPD0gbikJCQkJCQlcCisgICAgICBhLT5hcmdbYS0+Y291bnQrK10udHlwZSA9IFRZUEVfTk9ORTsJCQkJXAorICAgIGlmIChhLT5hcmdbbl0udHlwZSA9PSBUWVBFX05PTkUpCQkJCQlcCisgICAgICBhLT5hcmdbbl0udHlwZSA9IChfdHlwZV8pOwkJCQkJXAorICAgIGVsc2UgaWYgKGEtPmFyZ1tuXS50eXBlICE9IChfdHlwZV8pKQkJCQlcCisgICAgICAvKiBBbWJpZ3VvdXMgdHlwZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCQkJXAorICAgICAgZ290byBlcnJvcjsJCQkJCQkJXAorICB9CisKKyAgd2hpbGUgKCpjcCAhPSAnXDAnKQorICAgIHsKKyAgICAgIENIQVJfVCBjID0gKmNwKys7CisgICAgICBpZiAoYyA9PSAnJScpCisJeworCSAgc2l6ZV90IGFyZ19pbmRleCA9IEFSR19OT05FOworCSAgRElSRUNUSVZFICpkcCA9ICZkLT5kaXJbZC0+Y291bnRdOy8qIHBvaW50ZXIgdG8gbmV4dCBkaXJlY3RpdmUgKi8KKworCSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV4dCBkaXJlY3RpdmUuICAqLworCSAgZHAtPmRpcl9zdGFydCA9IGNwIC0gMTsKKwkgIGRwLT5mbGFncyA9IDA7CisJICBkcC0+d2lkdGhfc3RhcnQgPSBOVUxMOworCSAgZHAtPndpZHRoX2VuZCA9IE5VTEw7CisJICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gQVJHX05PTkU7CisJICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gTlVMTDsKKwkgIGRwLT5wcmVjaXNpb25fZW5kID0gTlVMTDsKKwkgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gQVJHX05PTkU7CisJICBkcC0+YXJnX2luZGV4ID0gQVJHX05PTkU7CisKKwkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLworCSAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKKwkgICAgeworCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7CisKKwkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKwkJOworCSAgICAgIGlmICgqbnAgPT0gJyQnKQorCQl7CisJCSAgc2l6ZV90IG4gPSAwOworCisJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCSAgICBuID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7CisJCSAgaWYgKG4gPT0gMCkKKwkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCisJCSAgICBnb3RvIGVycm9yOworCQkgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQorCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeSBsYXRlci4gICovCisJCSAgICBnb3RvIGVycm9yOworCQkgIGFyZ19pbmRleCA9IG4gLSAxOworCQkgIGNwID0gbnAgKyAxOworCQl9CisJICAgIH0KKworCSAgLyogUmVhZCB0aGUgZmxhZ3MuICAqLworCSAgZm9yICg7OykKKwkgICAgeworCSAgICAgIGlmICgqY3AgPT0gJ1wnJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX0dST1VQOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJy0nKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfTEVGVDsKKwkJICBjcCsrOworCQl9CisJICAgICAgZWxzZSBpZiAoKmNwID09ICcrJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX1NIT1dTSUdOOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJyAnKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfU1BBQ0U7CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnIycpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19BTFQ7CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnMCcpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19aRVJPOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisKKwkgIC8qIFBhcnNlIHRoZSBmaWVsZCB3aWR0aC4gICovCisJICBpZiAoKmNwID09ICcqJykKKwkgICAgeworCSAgICAgIGRwLT53aWR0aF9zdGFydCA9IGNwOworCSAgICAgIGNwKys7CisJICAgICAgZHAtPndpZHRoX2VuZCA9IGNwOworCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgMSkKKwkJbWF4X3dpZHRoX2xlbmd0aCA9IDE7CisKKwkgICAgICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KKwkgICAgICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorCQl7CisJCSAgY29uc3QgQ0hBUl9UICpucDsKKworCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorCQkgICAgOworCQkgIGlmICgqbnAgPT0gJyQnKQorCQkgICAgeworCQkgICAgICBzaXplX3QgbiA9IDA7CisKKwkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCQluID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7CisJCSAgICAgIGlmIChuID09IDApCisJCQkvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLworCQkJZ290byBlcnJvcjsKKwkJICAgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisJCQkvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5IGxhdGVyLiAgKi8KKwkJCWdvdG8gZXJyb3I7CisJCSAgICAgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBuIC0gMTsKKwkJICAgICAgY3AgPSBucCArIDE7CisJCSAgICB9CisJCX0KKwkgICAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJeworCQkgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBhcmdfcG9zbisrOworCQkgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ID09IEFSR19OT05FKQorCQkgICAgLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLworCQkgICAgZ290byBlcnJvcjsKKwkJfQorCSAgICAgIFJFR0lTVEVSX0FSRyAoZHAtPndpZHRoX2FyZ19pbmRleCwgVFlQRV9JTlQpOworCSAgICB9CisJICBlbHNlIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJICAgIHsKKwkgICAgICBzaXplX3Qgd2lkdGhfbGVuZ3RoOworCisJICAgICAgZHAtPndpZHRoX3N0YXJ0ID0gY3A7CisJICAgICAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKKwkJOworCSAgICAgIGRwLT53aWR0aF9lbmQgPSBjcDsKKwkgICAgICB3aWR0aF9sZW5ndGggPSBkcC0+d2lkdGhfZW5kIC0gZHAtPndpZHRoX3N0YXJ0OworCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgd2lkdGhfbGVuZ3RoKQorCQltYXhfd2lkdGhfbGVuZ3RoID0gd2lkdGhfbGVuZ3RoOworCSAgICB9CisKKwkgIC8qIFBhcnNlIHRoZSBwcmVjaXNpb24uICAqLworCSAgaWYgKCpjcCA9PSAnLicpCisJICAgIHsKKwkgICAgICBjcCsrOworCSAgICAgIGlmICgqY3AgPT0gJyonKQorCQl7CisJCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IGNwIC0gMTsKKwkJICBjcCsrOworCQkgIGRwLT5wcmVjaXNpb25fZW5kID0gY3A7CisJCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgMikKKwkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gMjsKKworCQkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLworCQkgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJCSAgICB7CisJCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7CisKKwkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCQk7CisJCSAgICAgIGlmICgqbnAgPT0gJyQnKQorCQkJeworCQkJICBzaXplX3QgbiA9IDA7CisKKwkJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCQkgICAgbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOworCQkJICBpZiAobiA9PSAwKQorCQkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCisJCQkgICAgZ290byBlcnJvcjsKKwkJCSAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisJCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeQorCQkJICAgICAgIGxhdGVyLiAgKi8KKwkJCSAgICBnb3RvIGVycm9yOworCQkJICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IG4gLSAxOworCQkJICBjcCA9IG5wICsgMTsKKwkJCX0KKwkJICAgIH0KKwkJICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPT0gQVJHX05PTkUpCisJCSAgICB7CisJCSAgICAgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKKwkJICAgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID09IEFSR19OT05FKQorCQkJLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLworCQkJZ290byBlcnJvcjsKKwkJICAgIH0KKwkJICBSRUdJU1RFUl9BUkcgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4LCBUWVBFX0lOVCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzaXplX3QgcHJlY2lzaW9uX2xlbmd0aDsKKworCQkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBjcCAtIDE7CisJCSAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKKwkJICAgIDsKKwkJICBkcC0+cHJlY2lzaW9uX2VuZCA9IGNwOworCQkgIHByZWNpc2lvbl9sZW5ndGggPSBkcC0+cHJlY2lzaW9uX2VuZCAtIGRwLT5wcmVjaXNpb25fc3RhcnQ7CisJCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgcHJlY2lzaW9uX2xlbmd0aCkKKwkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gcHJlY2lzaW9uX2xlbmd0aDsKKwkJfQorCSAgICB9CisKKwkgIHsKKwkgICAgYXJnX3R5cGUgdHlwZTsKKworCSAgICAvKiBQYXJzZSBhcmd1bWVudCB0eXBlL3NpemUgc3BlY2lmaWVycy4gICovCisJICAgIHsKKwkgICAgICBpbnQgZmxhZ3MgPSAwOworCisJICAgICAgZm9yICg7OykKKwkJeworCQkgIGlmICgqY3AgPT0gJ2gnKQorCQkgICAgeworCQkgICAgICBmbGFncyB8PSAoMSA8PCAoZmxhZ3MgJiAxKSk7CisJCSAgICAgIGNwKys7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoKmNwID09ICdMJykKKwkJICAgIHsKKwkJICAgICAgZmxhZ3MgfD0gNDsKKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgqY3AgPT0gJ2wnKQorCQkgICAgeworCQkgICAgICBmbGFncyArPSA4OworCQkgICAgICBjcCsrOworCQkgICAgfQorI2lmZGVmIEhBVkVfSU5UTUFYX1QKKwkJICBlbHNlIGlmICgqY3AgPT0gJ2onKQorCQkgICAgeworCQkgICAgICBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGxvbmcpKQorCQkJeworCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgbG9uZyAqLworCQkJICBmbGFncyArPSAxNjsKKwkJCX0KKwkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGludCkpCisJCQl7CisJCQkgIC8qIGludG1heF90ID0gbG9uZyAqLworCQkJICBmbGFncyArPSA4OworCQkJfQorCQkgICAgICBjcCsrOworCQkgICAgfQorI2VuZGlmCisJCSAgZWxzZSBpZiAoKmNwID09ICd6JyB8fCAqY3AgPT0gJ1onKQorCQkgICAgeworCQkgICAgICAvKiAneicgaXMgc3RhbmRhcmRpemVkIGluIElTTyBDIDk5LCBidXQgZ2xpYmMgdXNlcyAnWicKKwkJCSBiZWNhdXNlIHRoZSB3YXJuaW5nIGZhY2lsaXR5IGluIGdjYy0yLjk1LjIgdW5kZXJzdGFuZHMKKwkJCSBvbmx5ICdaJyAoc2VlIGdjYy0yLjk1LjIvZ2NjL2MtY29tbW9uLmM6MTc4NCkuICAqLworCQkgICAgICBpZiAoc2l6ZW9mIChzaXplX3QpID4gc2l6ZW9mIChsb25nKSkKKwkJCXsKKwkJCSAgLyogc2l6ZV90ID0gbG9uZyBsb25nICovCisJCQkgIGZsYWdzICs9IDE2OworCQkJfQorCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHNpemVfdCkgPiBzaXplb2YgKGludCkpCisJCQl7CisJCQkgIC8qIHNpemVfdCA9IGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gODsKKwkJCX0KKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgqY3AgPT0gJ3QnKQorCQkgICAgeworCQkgICAgICBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChsb25nKSkKKwkJCXsKKwkJCSAgLyogcHRyZGlmZl90ID0gbG9uZyBsb25nICovCisJCQkgIGZsYWdzICs9IDE2OworCQkJfQorCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHB0cmRpZmZfdCkgPiBzaXplb2YgKGludCkpCisJCQl7CisJCQkgIC8qIHB0cmRpZmZfdCA9IGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gODsKKwkJCX0KKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBicmVhazsKKwkJfQorCisJICAgICAgLyogUmVhZCB0aGUgY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLworCSAgICAgIGMgPSAqY3ArKzsKKwkgICAgICBzd2l0Y2ggKGMpCisJCXsKKwkJY2FzZSAnZCc6IGNhc2UgJ2knOgorI2lmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQorCQkgICAgdHlwZSA9IFRZUEVfTE9OR0xPTkdJTlQ7CisJCSAgZWxzZQorI2VuZGlmCisJCSAgaWYgKGZsYWdzID49IDgpCisJCSAgICB0eXBlID0gVFlQRV9MT05HSU5UOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKKwkJICAgIHR5cGUgPSBUWVBFX1NDSEFSOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKKwkJICAgIHR5cGUgPSBUWVBFX1NIT1JUOworCQkgIGVsc2UKKwkJICAgIHR5cGUgPSBUWVBFX0lOVDsKKwkJICBicmVhazsKKwkJY2FzZSAnbyc6IGNhc2UgJ3UnOiBjYXNlICd4JzogY2FzZSAnWCc6CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisJCSAgICB0eXBlID0gVFlQRV9VTE9OR0xPTkdJTlQ7CisJCSAgZWxzZQorI2VuZGlmCisJCSAgaWYgKGZsYWdzID49IDgpCisJCSAgICB0eXBlID0gVFlQRV9VTE9OR0lOVDsKKwkJICBlbHNlIGlmIChmbGFncyAmIDIpCisJCSAgICB0eXBlID0gVFlQRV9VQ0hBUjsKKwkJICBlbHNlIGlmIChmbGFncyAmIDEpCisJCSAgICB0eXBlID0gVFlQRV9VU0hPUlQ7CisJCSAgZWxzZQorCQkgICAgdHlwZSA9IFRZUEVfVUlOVDsKKwkJICBicmVhazsKKwkJY2FzZSAnZic6IGNhc2UgJ0YnOiBjYXNlICdlJzogY2FzZSAnRSc6IGNhc2UgJ2cnOiBjYXNlICdHJzoKKwkJY2FzZSAnYSc6IGNhc2UgJ0EnOgorI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisJCSAgICB0eXBlID0gVFlQRV9MT05HRE9VQkxFOworCQkgIGVsc2UKKyNlbmRpZgorCQkgIHR5cGUgPSBUWVBFX0RPVUJMRTsKKwkJICBicmVhazsKKwkJY2FzZSAnYyc6CisJCSAgaWYgKGZsYWdzID49IDgpCisjaWZkZWYgSEFWRV9XSU5UX1QKKwkJICAgIHR5cGUgPSBUWVBFX1dJREVfQ0hBUjsKKyNlbHNlCisJCSAgICBnb3RvIGVycm9yOworI2VuZGlmCisJCSAgZWxzZQorCQkgICAgdHlwZSA9IFRZUEVfQ0hBUjsKKwkJICBicmVhazsKKyNpZmRlZiBIQVZFX1dJTlRfVAorCQljYXNlICdDJzoKKwkJICB0eXBlID0gVFlQRV9XSURFX0NIQVI7CisJCSAgYyA9ICdjJzsKKwkJICBicmVhazsKKyNlbmRpZgorCQljYXNlICdzJzoKKwkJICBpZiAoZmxhZ3MgPj0gOCkKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKwkJICAgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOworI2Vsc2UKKwkJICAgIGdvdG8gZXJyb3I7CisjZW5kaWYKKwkJICBlbHNlCisJCSAgICB0eXBlID0gVFlQRV9TVFJJTkc7CisJCSAgYnJlYWs7CisjaWZkZWYgSEFWRV9XQ0hBUl9UCisJCWNhc2UgJ1MnOgorCQkgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOworCQkgIGMgPSAncyc7CisJCSAgYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAncCc6CisJCSAgdHlwZSA9IFRZUEVfUE9JTlRFUjsKKwkJICBicmVhazsKKwkJY2FzZSAnbic6CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOworCQkgIGVsc2UKKyNlbmRpZgorCQkgIGlmIChmbGFncyA+PSA4KQorCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKKwkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI7CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQorCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjsKKwkJICBlbHNlCisJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjsKKwkJICBicmVhazsKKwkJY2FzZSAnJSc6CisJCSAgdHlwZSA9IFRZUEVfTk9ORTsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAvKiBVbmtub3duIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgIH0KKworCSAgICBpZiAodHlwZSAhPSBUWVBFX05PTkUpCisJICAgICAgeworCQlkcC0+YXJnX2luZGV4ID0gYXJnX2luZGV4OworCQlpZiAoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJICB7CisJCSAgICBkcC0+YXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKKwkJICAgIGlmIChkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKQorCQkgICAgICAvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCisJCSAgICAgIGdvdG8gZXJyb3I7CisJCSAgfQorCQlSRUdJU1RFUl9BUkcgKGRwLT5hcmdfaW5kZXgsIHR5cGUpOworCSAgICAgIH0KKwkgICAgZHAtPmNvbnZlcnNpb24gPSBjOworCSAgICBkcC0+ZGlyX2VuZCA9IGNwOworCSAgfQorCisJICBkLT5jb3VudCsrOworCSAgaWYgKGQtPmNvdW50ID49IGRfYWxsb2NhdGVkKQorCSAgICB7CisJICAgICAgc2l6ZV90IG1lbW9yeV9zaXplOworCSAgICAgIERJUkVDVElWRSAqbWVtb3J5OworCisJICAgICAgZF9hbGxvY2F0ZWQgPSB4dGltZXMgKGRfYWxsb2NhdGVkLCAyKTsKKwkgICAgICBtZW1vcnlfc2l6ZSA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIHNpemVvZiAoRElSRUNUSVZFKSk7CisJICAgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQorCQkvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KKwkJZ290byBlcnJvcjsKKwkgICAgICBtZW1vcnkgPSByZWFsbG9jIChkLT5kaXIsIG1lbW9yeV9zaXplKTsKKwkgICAgICBpZiAobWVtb3J5ID09IE5VTEwpCisJCS8qIE91dCBvZiBtZW1vcnkuICAqLworCQlnb3RvIGVycm9yOworCSAgICAgIGQtPmRpciA9IG1lbW9yeTsKKwkgICAgfQorCX0KKyAgICB9CisgIGQtPmRpcltkLT5jb3VudF0uZGlyX3N0YXJ0ID0gY3A7CisKKyAgZC0+bWF4X3dpZHRoX2xlbmd0aCA9IG1heF93aWR0aF9sZW5ndGg7CisgIGQtPm1heF9wcmVjaXNpb25fbGVuZ3RoID0gbWF4X3ByZWNpc2lvbl9sZW5ndGg7CisgIHJldHVybiAwOworCitlcnJvcjoKKyAgaWYgKGEtPmFyZykKKyAgICBmcmVlIChhLT5hcmcpOworICBpZiAoZC0+ZGlyKQorICAgIGZyZWUgKGQtPmRpcik7CisgIHJldHVybiAtMTsKK30KKworI3VuZGVmIERJUkVDVElWRVMKKyN1bmRlZiBESVJFQ1RJVkUKKyN1bmRlZiBDSEFSX1QKKyN1bmRlZiBQUklOVEZfUEFSU0UKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3ByaW50Zi1wYXJzZS5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvcHJpbnRmLXBhcnNlLmgJMjAwNC0wOS0xMiAxNDo0MDozNC42Mjg3MDY1OTIgLTA0MDAKQEAgLTAsMCArMSw3NSBAQAorLyogUGFyc2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1BSSU5URl9QQVJTRV9ICisjZGVmaW5lIF9QUklOVEZfUEFSU0VfSAorCisjaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKKworCisvKiBGbGFncyAqLworI2RlZmluZSBGTEFHX0dST1VQCSAxCS8qICcgZmxhZyAqLworI2RlZmluZSBGTEFHX0xFRlQJIDIJLyogLSBmbGFnICovCisjZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCisjZGVmaW5lIEZMQUdfU1BBQ0UJIDgJLyogc3BhY2UgZmxhZyAqLworI2RlZmluZSBGTEFHX0FMVAkxNgkvKiAjIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19aRVJPCTMyCisKKy8qIGFyZ19pbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnQgaXMgY29uc3VtZWQuICAqLworI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKKworLyogQSBwYXJzZWQgZGlyZWN0aXZlLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIqIGRpcl9zdGFydDsKKyAgY29uc3QgY2hhciogZGlyX2VuZDsKKyAgaW50IGZsYWdzOworICBjb25zdCBjaGFyKiB3aWR0aF9zdGFydDsKKyAgY29uc3QgY2hhciogd2lkdGhfZW5kOworICBzaXplX3Qgd2lkdGhfYXJnX2luZGV4OworICBjb25zdCBjaGFyKiBwcmVjaXNpb25fc3RhcnQ7CisgIGNvbnN0IGNoYXIqIHByZWNpc2lvbl9lbmQ7CisgIHNpemVfdCBwcmVjaXNpb25fYXJnX2luZGV4OworICBjaGFyIGNvbnZlcnNpb247IC8qIGQgaSBvIHUgeCBYIGYgZSBFIGcgRyBjIHMgcCBuIFUgJSBidXQgbm90IEMgUyAqLworICBzaXplX3QgYXJnX2luZGV4OworfQorY2hhcl9kaXJlY3RpdmU7CisKKy8qIEEgcGFyc2VkIGZvcm1hdCBzdHJpbmcuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGNvdW50OworICBjaGFyX2RpcmVjdGl2ZSAqZGlyOworICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKKyAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoOworfQorY2hhcl9kaXJlY3RpdmVzOworCisKKy8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKKyAgIGluIGRpcmVjdGl2ZXNbMF0sIC4uLiwgZGlyZWN0aXZlc1tOLTFdLCBhbmQgc2V0cyBkaXJlY3RpdmVzW05dLmRpcl9zdGFydAorICAgdG8gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIEFsc28gZmlsbHMgaW4gdGhlIGFyZ190eXBlIGZpZWxkcyBvZiB0aGUKKyAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZWxzZQorZXh0ZXJuCisjZW5kaWYKK2ludCBwcmludGZfcGFyc2UgKGNvbnN0IGNoYXIgKmZvcm1hdCwgY2hhcl9kaXJlY3RpdmVzICpkLCBhcmd1bWVudHMgKmEpOworCisjZW5kaWYgLyogX1BSSU5URl9QQVJTRV9IICovCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9yZWYtYWRkLnNpbgkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL3JlZi1hZGQuc2luCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjMzNzA1ODMyIC0wNDAwCkBAIC0wLDAgKzEsMzEgQEAKKyMgQWRkIHRoaXMgcGFja2FnZSB0byBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUuCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjICAgVVNBLgorIworIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPi4KKyMKKy9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8geworICBzLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8vCisgIHRhCisgIDphCisgIHMvIEBQQUNLQUdFQCAvIEBQQUNLQUdFQCAvCisgIHRiCisgIHMvICQvIEBQQUNLQUdFQCAvCisgIDpiCisgIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCit9Ci0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9yZWYtZGVsLnNpbgkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL3JlZi1kZWwuc2luCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjM4NzA1MDcyIC0wNDAwCkBAIC0wLDAgKzEsMjYgQEAKKyMgUmVtb3ZlIHRoaXMgcGFja2FnZSBmcm9tIGEgbGlzdCBvZiByZWZlcmVuY2VzIHN0b3JlZCBpbiBhIHRleHQgZmlsZS4KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisjICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyAgIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworIyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyMgICBVU0EuCisjCisjIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LgorIworL14jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTogLyB7CisgIHMvIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6Ly8KKyAgcy8gQFBBQ0tBR0VAIC8gLworICBzL14vIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6LworfQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvcmVsb2NhdGFibGUuYwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL3JlbG9jYXRhYmxlLmMJMjAwNC0wOS0xMiAxNDo0MDozNC42NDQ3MDQxNjAgLTA0MDAKQEAgLTAsMCArMSw0NDkgQEAKKy8qIFByb3ZpZGUgcmVsb2NhdGFibGUgcGFja2FnZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8YnJ1bm9AY2xpc3Aub3JnPiwgMjAwMy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKworLyogVGVsbCBnbGliYydzIDxzdGRpby5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBnZXRsaW5lKCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFCTEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKyNpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgorCisjaWYgRU5BQkxFX1JFTE9DQVRBQkxFCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgTk9fWE1BTExPQworIyBkZWZpbmUgeG1hbGxvYyBtYWxsb2MKKyNlbHNlCisjIGluY2x1ZGUgInhhbGxvYy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXworIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmIERFUEVORFNfT05fTElCQ0hBUlNFVAorIyBpbmNsdWRlIDxsaWJjaGFyc2V0Lmg+CisjZW5kaWYKKyNpZiBERVBFTkRTX09OX0xJQklDT05WICYmIEhBVkVfSUNPTlYKKyMgaW5jbHVkZSA8aWNvbnYuaD4KKyNlbmRpZgorI2lmIERFUEVORFNfT05fTElCSU5UTCAmJiBFTkFCTEVfTkxTCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbmRpZgorCisvKiBGYWtlZCBjaGVhcCAnYm9vbCcuICAqLworI3VuZGVmIGJvb2wKKyN1bmRlZiBmYWxzZQorI3VuZGVmIHRydWUKKyNkZWZpbmUgYm9vbCBpbnQKKyNkZWZpbmUgZmFsc2UgMAorI2RlZmluZSB0cnVlIDEKKworLyogUGF0aG5hbWUgc3VwcG9ydC4KKyAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgSVNfUEFUSF9XSVRIX0RJUihQKSAgdGVzdHMgd2hldGhlciBQIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHNwZWNpZmljYXRpb24uCisgKi8KKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJyB8fCAoQykgPT0gJ1xcJykKKyMgZGVmaW5lIEhBU19ERVZJQ0UoUCkgXAorICAgICgoKChQKVswXSA+PSAnQScgJiYgKFApWzBdIDw9ICdaJykgfHwgKChQKVswXSA+PSAnYScgJiYgKFApWzBdIDw9ICd6JykpIFwKKyAgICAgJiYgKFApWzFdID09ICc6JykKKyMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgXAorICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCisjIGRlZmluZSBGSUxFU1lTVEVNX1BSRUZJWF9MRU4oUCkgKEhBU19ERVZJQ0UgKFApID8gMiA6IDApCisjZWxzZQorICAvKiBVbml4ICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQorIyBkZWZpbmUgSVNfUEFUSF9XSVRIX0RJUihQKSAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwpCisjIGRlZmluZSBGSUxFU1lTVEVNX1BSRUZJWF9MRU4oUCkgMAorI2VuZGlmCisKKy8qIE9yaWdpbmFsIGluc3RhbGxhdGlvbiBwcmVmaXguICAqLworc3RhdGljIGNoYXIgKm9yaWdfcHJlZml4Oworc3RhdGljIHNpemVfdCBvcmlnX3ByZWZpeF9sZW47CisvKiBDdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXguICAqLworc3RhdGljIGNoYXIgKmN1cnJfcHJlZml4Oworc3RhdGljIHNpemVfdCBjdXJyX3ByZWZpeF9sZW47CisvKiBUaGVzZSBwcmVmaXhlcyBkbyBub3QgZW5kIGluIGEgc2xhc2guICBBbnl0aGluZyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkCisgICB0byB0aGVtIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoLiAgKi8KKworLyogU2V0cyB0aGUgb3JpZ2luYWwgYW5kIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggb2YgdGhpcyBtb2R1bGUuCisgICBSZWxvY2F0aW9uIHNpbXBseSByZXBsYWNlcyBhIHBhdGhuYW1lIHN0YXJ0aW5nIHdpdGggdGhlIG9yaWdpbmFsIHByZWZpeAorICAgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcGF0aG5hbWUgd2l0aCB0aGUgY3VycmVudCBwcmVmaXggaW5zdGVhZC4gIEJvdGgKKyAgIHByZWZpeGVzIHNob3VsZCBiZSBkaXJlY3RvcnkgbmFtZXMgd2l0aG91dCB0cmFpbGluZyBzbGFzaCAoaS5lLiB1c2UgIiIKKyAgIGluc3RlYWQgb2YgIi8iKS4gICovCitzdGF0aWMgdm9pZAorc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4X2FyZywKKwkJCSAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeF9hcmcpCit7CisgIGlmIChvcmlnX3ByZWZpeF9hcmcgIT0gTlVMTCAmJiBjdXJyX3ByZWZpeF9hcmcgIT0gTlVMTAorICAgICAgLyogT3B0aW1pemF0aW9uOiBpZiBvcmlnX3ByZWZpeCBhbmQgY3Vycl9wcmVmaXggYXJlIGVxdWFsLCB0aGUKKwkgcmVsb2NhdGlvbiBpcyBhIG5vcC4gICovCisgICAgICAmJiBzdHJjbXAgKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIER1cGxpY2F0ZSB0aGUgYXJndW1lbnQgc3RyaW5ncy4gICovCisgICAgICBjaGFyICptZW1vcnk7CisKKyAgICAgIG9yaWdfcHJlZml4X2xlbiA9IHN0cmxlbiAob3JpZ19wcmVmaXhfYXJnKTsKKyAgICAgIGN1cnJfcHJlZml4X2xlbiA9IHN0cmxlbiAoY3Vycl9wcmVmaXhfYXJnKTsKKyAgICAgIG1lbW9yeSA9IChjaGFyICopIHhtYWxsb2MgKG9yaWdfcHJlZml4X2xlbiArIDEgKyBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKKyNpZmRlZiBOT19YTUFMTE9DCisgICAgICBpZiAobWVtb3J5ICE9IE5VTEwpCisjZW5kaWYKKwl7CisJICBtZW1jcHkgKG1lbW9yeSwgb3JpZ19wcmVmaXhfYXJnLCBvcmlnX3ByZWZpeF9sZW4gKyAxKTsKKwkgIG9yaWdfcHJlZml4ID0gbWVtb3J5OworCSAgbWVtb3J5ICs9IG9yaWdfcHJlZml4X2xlbiArIDE7CisJICBtZW1jcHkgKG1lbW9yeSwgY3Vycl9wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9sZW4gKyAxKTsKKwkgIGN1cnJfcHJlZml4ID0gbWVtb3J5OworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIG9yaWdfcHJlZml4ID0gTlVMTDsKKyAgY3Vycl9wcmVmaXggPSBOVUxMOworICAvKiBEb24ndCB3b3JyeSBhYm91dCB3YXN0ZWQgbWVtb3J5IGhlcmUgLSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgb25seQorICAgICBjYWxsZWQgb25jZS4gICovCit9CisKKy8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgorICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKyAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCisgICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCisgICBpbnN0ZWFkIG9mICIvIikuICAqLwordm9pZAorc2V0X3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeF9hcmcsIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2FyZykKK3sKKyAgc2V0X3RoaXNfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKworICAvKiBOb3cgbm90aWZ5IGFsbCBkZXBlbmRlbnQgbGlicmFyaWVzLiAgKi8KKyNpZiBERVBFTkRTX09OX0xJQkNIQVJTRVQKKyAgbGliY2hhcnNldF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKG9yaWdfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfYXJnKTsKKyNlbmRpZgorI2lmIERFUEVORFNfT05fTElCSUNPTlYgJiYgSEFWRV9JQ09OViAmJiBfTElCSUNPTlZfVkVSU0lPTiA+PSAweDAxMDkKKyAgbGliaWNvbnZfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7CisjZW5kaWYKKyNpZiBERVBFTkRTX09OX0xJQklOVEwgJiYgRU5BQkxFX05MUyAmJiBkZWZpbmVkIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4CisgIGxpYmludGxfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7CisjZW5kaWYKK30KKworI2lmICFkZWZpbmVkIElOX0xJQlJBUlkgfHwgKGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUikKKworLyogQ29udmVuaWVuY2UgZnVuY3Rpb246CisgICBDb21wdXRlcyB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwKKyAgIGluc3RhbGxhdGlvbiBwcmVmaXgsIHRoZSBvcmlnaW5hbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGEgcGFydGljdWxhcgorICAgZmlsZSwgYW5kIHRoZSBjdXJyZW50IHBhdGhuYW1lIG9mIHRoaXMgZmlsZS4gIFJldHVybnMgTlVMTCB1cG9uIGZhaWx1cmUuICAqLworI2lmZGVmIElOX0xJQlJBUlkKKyNkZWZpbmUgY29tcHV0ZV9jdXJyX3ByZWZpeCBsb2NhbF9jb21wdXRlX2N1cnJfcHJlZml4CitzdGF0aWMKKyNlbmRpZgorY29uc3QgY2hhciAqCitjb21wdXRlX2N1cnJfcHJlZml4IChjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXgsCisJCSAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAorCQkgICAgIGNvbnN0IGNoYXIgKmN1cnJfcGF0aG5hbWUpCit7CisgIGNvbnN0IGNoYXIgKmN1cnJfaW5zdGFsbGRpcjsKKyAgY29uc3QgY2hhciAqcmVsX2luc3RhbGxkaXI7CisKKyAgaWYgKGN1cnJfcGF0aG5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBEZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIHJlbGF0aXZlIHRvIHRoZSBwcmVmaXguCisgICAgIFRoaXMgaXMgc2ltcGx5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JpZ19pbnN0YWxscHJlZml4IGFuZAorICAgICBvcmlnX2luc3RhbGxkaXIuICAqLworICBpZiAoc3RybmNtcCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KSkKKyAgICAgICE9IDApCisgICAgLyogU2hvdWxkbid0IGhhcHBlbiAtIG5vdGhpbmcgc2hvdWxkIGJlIGluc3RhbGxlZCBvdXRzaWRlICQocHJlZml4KS4gICovCisgICAgcmV0dXJuIE5VTEw7CisgIHJlbF9pbnN0YWxsZGlyID0gb3JpZ19pbnN0YWxsZGlyICsgc3RybGVuIChvcmlnX2luc3RhbGxwcmVmaXgpOworCisgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgKi8KKyAgeworICAgIGNvbnN0IGNoYXIgKnBfYmFzZSA9IGN1cnJfcGF0aG5hbWUgKyBGSUxFU1lTVEVNX1BSRUZJWF9MRU4gKGN1cnJfcGF0aG5hbWUpOworICAgIGNvbnN0IGNoYXIgKnAgPSBjdXJyX3BhdGhuYW1lICsgc3RybGVuIChjdXJyX3BhdGhuYW1lKTsKKyAgICBjaGFyICpxOworCisgICAgd2hpbGUgKHAgPiBwX2Jhc2UpCisgICAgICB7CisJcC0tOworCWlmIChJU1NMQVNIICgqcCkpCisJICBicmVhazsKKyAgICAgIH0KKworICAgIHEgPSAoY2hhciAqKSB4bWFsbG9jIChwIC0gY3Vycl9wYXRobmFtZSArIDEpOworI2lmZGVmIE5PX1hNQUxMT0MKKyAgICBpZiAocSA9PSBOVUxMKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICBtZW1jcHkgKHEsIGN1cnJfcGF0aG5hbWUsIHAgLSBjdXJyX3BhdGhuYW1lKTsKKyAgICBxW3AgLSBjdXJyX3BhdGhuYW1lXSA9ICdcMCc7CisgICAgY3Vycl9pbnN0YWxsZGlyID0gcTsKKyAgfQorCisgIC8qIENvbXB1dGUgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBieSByZW1vdmluZyB0aGUgdHJhaWxpbmcKKyAgICAgcmVsX2luc3RhbGxkaXIgZnJvbSBpdC4gICovCisgIHsKKyAgICBjb25zdCBjaGFyICpycCA9IHJlbF9pbnN0YWxsZGlyICsgc3RybGVuIChyZWxfaW5zdGFsbGRpcik7CisgICAgY29uc3QgY2hhciAqY3AgPSBjdXJyX2luc3RhbGxkaXIgKyBzdHJsZW4gKGN1cnJfaW5zdGFsbGRpcik7CisgICAgY29uc3QgY2hhciAqY3BfYmFzZSA9CisgICAgICBjdXJyX2luc3RhbGxkaXIgKyBGSUxFU1lTVEVNX1BSRUZJWF9MRU4gKGN1cnJfaW5zdGFsbGRpcik7CisKKyAgICB3aGlsZSAocnAgPiByZWxfaW5zdGFsbGRpciAmJiBjcCA+IGNwX2Jhc2UpCisgICAgICB7CisJYm9vbCBzYW1lID0gZmFsc2U7CisJY29uc3QgY2hhciAqcnBpID0gcnA7CisJY29uc3QgY2hhciAqY3BpID0gY3A7CisKKwl3aGlsZSAocnBpID4gcmVsX2luc3RhbGxkaXIgJiYgY3BpID4gY3BfYmFzZSkKKwkgIHsKKwkgICAgcnBpLS07CisJICAgIGNwaS0tOworCSAgICBpZiAoSVNTTEFTSCAoKnJwaSkgfHwgSVNTTEFTSCAoKmNwaSkpCisJICAgICAgeworCQlpZiAoSVNTTEFTSCAoKnJwaSkgJiYgSVNTTEFTSCAoKmNwaSkpCisJCSAgc2FtZSA9IHRydWU7CisJCWJyZWFrOworCSAgICAgIH0KKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKwkgICAgLyogV2luMzIsIE9TLzIsIERPUyAtIGNhc2UgaW5zaWduaWZpY2FudCBmaWxlc3lzdGVtICovCisJICAgIGlmICgoKnJwaSA+PSAnYScgJiYgKnJwaSA8PSAneicgPyAqcnBpIC0gJ2EnICsgJ0EnIDogKnJwaSkKKwkJIT0gKCpjcGkgPj0gJ2EnICYmICpjcGkgPD0gJ3onID8gKmNwaSAtICdhJyArICdBJyA6ICpjcGkpKQorCSAgICAgIGJyZWFrOworI2Vsc2UKKwkgICAgaWYgKCpycGkgIT0gKmNwaSkKKwkgICAgICBicmVhazsKKyNlbmRpZgorCSAgfQorCWlmICghc2FtZSkKKwkgIGJyZWFrOworCS8qIFRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudCB3YXMgdGhlIHNhbWUuICBvcGkgYW5kIGNwaSBub3cgcG9pbnQKKwkgICB0byB0aGUgc2xhc2ggYmVmb3JlIGl0LiAgKi8KKwlycCA9IHJwaTsKKwljcCA9IGNwaTsKKyAgICAgIH0KKworICAgIGlmIChycCA+IHJlbF9pbnN0YWxsZGlyKQorICAgICAgLyogVW5leHBlY3RlZDogVGhlIGN1cnJfaW5zdGFsbGRpciBkb2VzIG5vdCBlbmQgd2l0aCByZWxfaW5zdGFsbGRpci4gICovCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIHsKKyAgICAgIHNpemVfdCBjdXJyX3ByZWZpeF9sZW4gPSBjcCAtIGN1cnJfaW5zdGFsbGRpcjsKKyAgICAgIGNoYXIgKmN1cnJfcHJlZml4OworCisgICAgICBjdXJyX3ByZWZpeCA9IChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIDEpOworI2lmZGVmIE5PX1hNQUxMT0MKKyAgICAgIGlmIChjdXJyX3ByZWZpeCA9PSBOVUxMKQorCXJldHVybiBOVUxMOworI2VuZGlmCisgICAgICBtZW1jcHkgKGN1cnJfcHJlZml4LCBjdXJyX2luc3RhbGxkaXIsIGN1cnJfcHJlZml4X2xlbik7CisgICAgICBjdXJyX3ByZWZpeFtjdXJyX3ByZWZpeF9sZW5dID0gJ1wwJzsKKworICAgICAgcmV0dXJuIGN1cnJfcHJlZml4OworICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogIUlOX0xJQlJBUlkgfHwgUElDICovCisKKyNpZiBkZWZpbmVkIFBJQyAmJiBkZWZpbmVkIElOU1RBTExESVIKKworLyogRnVsbCBwYXRobmFtZSBvZiBzaGFyZWQgbGlicmFyeSwgb3IgTlVMTC4gICovCitzdGF0aWMgY2hhciAqc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7CisKKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXworCisvKiBEZXRlcm1pbmUgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IHdoZW4gaXQgaXMgbG9hZGVkLiAgKi8KKworQk9PTCBXSU5BUEkKK0RsbE1haW4gKEhJTlNUQU5DRSBtb2R1bGVfaGFuZGxlLCBEV09SRCBldmVudCwgTFBWT0lEIHJlc2VydmVkKQoreworICAodm9pZCkgcmVzZXJ2ZWQ7CisKKyAgaWYgKGV2ZW50ID09IERMTF9QUk9DRVNTX0FUVEFDSCkKKyAgICB7CisgICAgICAvKiBUaGUgRExMIGlzIGJlaW5nIGxvYWRlZCBpbnRvIGFuIGFwcGxpY2F0aW9uJ3MgYWRkcmVzcyByYW5nZS4gICovCisgICAgICBzdGF0aWMgY2hhciBsb2NhdGlvbltNQVhfUEFUSF07CisKKyAgICAgIGlmICghR2V0TW9kdWxlRmlsZU5hbWUgKG1vZHVsZV9oYW5kbGUsIGxvY2F0aW9uLCBzaXplb2YgKGxvY2F0aW9uKSkpCisJLyogU2hvdWxkbid0IGhhcHBlbi4gICovCisJcmV0dXJuIEZBTFNFOworCisgICAgICBpZiAoIUlTX1BBVEhfV0lUSF9ESVIgKGxvY2F0aW9uKSkKKwkvKiBTaG91bGRuJ3QgaGFwcGVuLiAgKi8KKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gc3RyZHVwIChsb2NhdGlvbik7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZWxzZSAvKiBVbml4ICovCisKK3N0YXRpYyB2b2lkCitmaW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpCit7CisjaWYgZGVmaW5lZCBfX2xpbnV4X18gJiYgX19HTElCQ19fID49IDIKKyAgLyogTGludXggaGFzIC9wcm9jL3NlbGYvbWFwcy4gZ2xpYmMgMiBoYXMgdGhlIGdldGxpbmUoKSBmdW5jdGlvbi4gICovCisgIEZJTEUgKmZwOworCisgIC8qIE9wZW4gdGhlIGN1cnJlbnQgcHJvY2VzcycgbWFwcyBmaWxlLiAgSXQgZGVzY3JpYmVzIG9uZSBWTUEgcGVyIGxpbmUuICAqLworICBmcCA9IGZvcGVuICgiL3Byb2Mvc2VsZi9tYXBzIiwgInIiKTsKKyAgaWYgKGZwKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSAmZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKKyAgICAgIGZvciAoOzspCisJeworCSAgdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCSAgaW50IGM7CisKKwkgIGlmIChmc2NhbmYgKGZwLCAiJWx4LSVseCIsICZzdGFydCwgJmVuZCkgIT0gMikKKwkgICAgYnJlYWs7CisJICBpZiAoYWRkcmVzcyA+PSBzdGFydCAmJiBhZGRyZXNzIDw9IGVuZCAtIDEpCisJICAgIHsKKwkgICAgICAvKiBGb3VuZCBpdC4gIE5vdyBzZWUgaWYgdGhpcyBsaW5lIGNvbnRhaW5zIGEgZmlsZW5hbWUuICAqLworCSAgICAgIHdoaWxlIChjID0gZ2V0YyAoZnApLCBjICE9IEVPRiAmJiBjICE9ICdcbicgJiYgYyAhPSAnLycpCisJCWNvbnRpbnVlOworCSAgICAgIGlmIChjID09ICcvJykKKwkJeworCQkgIHNpemVfdCBzaXplOworCQkgIGludCBsZW47CisKKwkJICB1bmdldGMgKGMsIGZwKTsKKwkJICBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IE5VTEw7IHNpemUgPSAwOworCQkgIGxlbiA9IGdldGxpbmUgKCZzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSwgJnNpemUsIGZwKTsKKwkJICBpZiAobGVuID49IDApCisJCSAgICB7CisJCSAgICAgIC8qIFN1Y2Nlc3M6IGZpbGxlZCBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZS4gICovCisJCSAgICAgIGlmIChsZW4gPiAwICYmIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lW2xlbiAtIDFdID09ICdcbicpCisJCQlzaGFyZWRfbGlicmFyeV9mdWxsbmFtZVtsZW4gLSAxXSA9ICdcMCc7CisJCSAgICB9CisJCX0KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgd2hpbGUgKGMgPSBnZXRjIChmcCksIGMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKwkgICAgY29udGludWU7CisJfQorICAgICAgZmNsb3NlIChmcCk7CisgICAgfQorI2VuZGlmCit9CisKKyNlbmRpZiAvKiBXSU4zMiAvIFVuaXggKi8KKworLyogUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNoYXJlZCBsaWJyYXJ5LgorICAgUmV0dXJuIE5VTEwgaWYgdW5rbm93bi4KKyAgIEd1YXJhbnRlZWQgdG8gd29yayBvbmx5IG9uIExpbnV4IGFuZCBXb2UzMi4gICovCitzdGF0aWMgY2hhciAqCitnZXRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCkKK3sKKyNpZiAhKGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fKQorICBzdGF0aWMgYm9vbCB0cmllZF9maW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOworICBpZiAoIXRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUpCisgICAgeworICAgICAgZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKTsKKyAgICAgIHRyaWVkX2ZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSB0cnVlOworICAgIH0KKyNlbmRpZgorICByZXR1cm4gc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7Cit9CisKKyNlbmRpZiAvKiBQSUMgKi8KKworLyogUmV0dXJucyB0aGUgcGF0aG5hbWUsIHJlbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uCisgICBkaXJlY3RvcnkuICAqLworY29uc3QgY2hhciAqCityZWxvY2F0ZSAoY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisjaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCisgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKyAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYSBzaGFyZWQgbGlicmFyeS4gICovCisgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgLyogQXQgdGhpcyBwb2ludCwgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGxpa2VseSBoYXZlIGFscmVhZHkgYmVlbgorCSBzZXQgdGhyb3VnaCB0aGUgbWFpbiBwcm9ncmFtJ3Mgc2V0X3Byb2dyYW1fbmFtZV9hbmRfaW5zdGFsbGRpcgorCSBmdW5jdGlvbi4gIFRoaXMgaXMgc3VmZmljaWVudCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBsaWJyYXJ5IGhhcworCSBpbml0aWFsbHkgYmVlbiBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgb3JpZ19wcmVmaXguICBCdXQgd2UgY2FuIGRvCisJIGJldHRlciwgdG8gYWxzbyBjb3ZlciB0aGUgY2FzZXMgdGhhdCAxLiBpdCBoYXMgYmVlbiBpbnN0YWxsZWQKKwkgaW4gYSBkaWZmZXJlbnQgcHJlZml4IGJlZm9yZSBiZWluZyBtb3ZlZCB0byBvcmlnX3ByZWZpeCBhbmQgKGxhdGVyKQorCSB0byBjdXJyX3ByZWZpeCwgMi4gdW5saWtlIHRoZSBwcm9ncmFtLCBpdCBoYXMgbm90IG1vdmVkIGF3YXkgZnJvbQorCSBvcmlnX3ByZWZpeC4gICovCisgICAgICBjb25zdCBjaGFyICpvcmlnX2luc3RhbGxwcmVmaXggPSBJTlNUQUxMUFJFRklYOworICAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyID0gSU5TVEFMTERJUjsKKyAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4X2JldHRlcjsKKworICAgICAgY3Vycl9wcmVmaXhfYmV0dGVyID0KKwljb21wdXRlX2N1cnJfcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIG9yaWdfaW5zdGFsbGRpciwKKwkJCSAgICAgZ2V0X3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpKTsKKyAgICAgIGlmIChjdXJyX3ByZWZpeF9iZXR0ZXIgPT0gTlVMTCkKKwljdXJyX3ByZWZpeF9iZXR0ZXIgPSBjdXJyX3ByZWZpeDsKKworICAgICAgc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX2luc3RhbGxwcmVmaXgsIGN1cnJfcHJlZml4X2JldHRlcik7CisKKyAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9CisjZW5kaWYKKworICAvKiBOb3RlOiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIGhlcmUsCisgICAgIGV2ZW4gZm9yIERPUy1saWtlIGZpbGVzeXN0ZW1zLCBiZWNhdXNlIHRoZSBwYXRobmFtZSBhcmd1bWVudCB3YXMKKyAgICAgdHlwaWNhbGx5IGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBNYWtlZmlsZSB2YXJpYWJsZSBhcyBvcmlnX3ByZWZpeCBjYW1lCisgICAgIGZyb20uICAqLworICBpZiAob3JpZ19wcmVmaXggIT0gTlVMTCAmJiBjdXJyX3ByZWZpeCAhPSBOVUxMCisgICAgICAmJiBzdHJuY21wIChwYXRobmFtZSwgb3JpZ19wcmVmaXgsIG9yaWdfcHJlZml4X2xlbikgPT0gMCkKKyAgICB7CisgICAgICBpZiAocGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXSA9PSAnXDAnKQorCS8qIHBhdGhuYW1lIGVxdWFscyBvcmlnX3ByZWZpeC4gICovCisJcmV0dXJuIGN1cnJfcHJlZml4OworICAgICAgaWYgKElTU0xBU0ggKHBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl0pKQorCXsKKwkgIC8qIHBhdGhuYW1lIHN0YXJ0cyB3aXRoIG9yaWdfcHJlZml4LiAgKi8KKwkgIGNvbnN0IGNoYXIgKnBhdGhuYW1lX3RhaWwgPSAmcGF0aG5hbWVbb3JpZ19wcmVmaXhfbGVuXTsKKwkgIGNoYXIgKnJlc3VsdCA9CisJICAgIChjaGFyICopIHhtYWxsb2MgKGN1cnJfcHJlZml4X2xlbiArIHN0cmxlbiAocGF0aG5hbWVfdGFpbCkgKyAxKTsKKworI2lmZGVmIE5PX1hNQUxMT0MKKwkgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyNlbmRpZgorCSAgICB7CisJICAgICAgbWVtY3B5IChyZXN1bHQsIGN1cnJfcHJlZml4LCBjdXJyX3ByZWZpeF9sZW4pOworCSAgICAgIHN0cmNweSAocmVzdWx0ICsgY3Vycl9wcmVmaXhfbGVuLCBwYXRobmFtZV90YWlsKTsKKwkgICAgICByZXR1cm4gcmVzdWx0OworCSAgICB9CisJfQorICAgIH0KKyAgLyogTm90aGluZyB0byByZWxvY2F0ZS4gICovCisgIHJldHVybiBwYXRobmFtZTsKK30KKworI2VuZGlmCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC9yZWxvY2F0YWJsZS5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvcmVsb2NhdGFibGUuaAkyMDA0LTA5LTEyIDE0OjQwOjM0LjY1MTcwMzA5NiAtMDQwMApAQCAtMCwwICsxLDc3IEBACisvKiBQcm92aWRlIHJlbG9jYXRhYmxlIHBhY2thZ2VzLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9SRUxPQ0FUQUJMRV9ICisjZGVmaW5lIF9SRUxPQ0FUQUJMRV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBUaGlzIGNhbiBiZSBlbmFibGVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZSAtLWVuYWJsZS1yZWxvY2F0YWJsZSBvcHRpb24uICAqLworI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQorCisvKiBXaGVuIGJ1aWxkaW5nIGEgRExMLCB3ZSBtdXN0IGV4cG9ydCBzb21lIGZ1bmN0aW9ucy4gIE5vdGUgdGhhdCBiZWNhdXNlCisgICB0aGlzIGlzIGEgcHJpdmF0ZSAuaCBmaWxlLCB3ZSBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyAgIGluIGFueSBjYXNlLiAgKi8KKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIEJVSUxESU5HX0RMTAorIyBkZWZpbmUgUkVMT0NBVEFCTEVfRExMX0VYUE9SVEVEIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2Vsc2UKKyMgZGVmaW5lIFJFTE9DQVRBQkxFX0RMTF9FWFBPUlRFRAorI2VuZGlmCisKKy8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoZSBwYWNrYWdlLgorICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKyAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCisgICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCisgICBpbnN0ZWFkIG9mICIvIikuICAqLworZXh0ZXJuIFJFTE9DQVRBQkxFX0RMTF9FWFBPUlRFRCB2b2lkCisgICAgICAgc2V0X3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4KTsKKworLyogUmV0dXJucyB0aGUgcGF0aG5hbWUsIHJlbG9jYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uCisgICBkaXJlY3RvcnkuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiByZWxvY2F0ZSAoY29uc3QgY2hhciAqcGF0aG5hbWUpOworCisvKiBNZW1vcnkgbWFuYWdlbWVudDogcmVsb2NhdGUoKSBsZWFrcyBtZW1vcnksIGJlY2F1c2UgaXQgaGFzIHRvIGNvbnN0cnVjdAorICAgYSBmcmVzaCBwYXRobmFtZS4gIElmIHRoaXMgaXMgYSBwcm9ibGVtIGJlY2F1c2UgeW91ciBwcm9ncmFtIGNhbGxzCisgICByZWxvY2F0ZSgpIGZyZXF1ZW50bHksIHRoaW5rIGFib3V0IGNhY2hpbmcgdGhlIHJlc3VsdC4gICovCisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uOgorICAgQ29tcHV0ZXMgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCwgYmFzZWQgb24gdGhlIG9yaWdpbmFsCisgICBpbnN0YWxsYXRpb24gcHJlZml4LCB0aGUgb3JpZ2luYWwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBhIHBhcnRpY3VsYXIKKyAgIGZpbGUsIGFuZCB0aGUgY3VycmVudCBwYXRobmFtZSBvZiB0aGlzIGZpbGUuICBSZXR1cm5zIE5VTEwgdXBvbiBmYWlsdXJlLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICogY29tcHV0ZV9jdXJyX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19pbnN0YWxscHJlZml4LAorCQkJCQkgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxsZGlyLAorCQkJCQkgY29uc3QgY2hhciAqY3Vycl9wYXRobmFtZSk7CisKKyNlbHNlCisKKy8qIEJ5IGRlZmF1bHQsIHdlIHVzZSB0aGUgaGFyZHdpcmVkIHBhdGhuYW1lcy4gICovCisjZGVmaW5lIHJlbG9jYXRlKHBhdGhuYW1lKSAocGF0aG5hbWUpCisKKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfUkVMT0NBVEFCTEVfSCAqLwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvdGV4dGRvbWFpbi5jCTE5OTgtMDQtMjYgMDk6MjI6MzcuMDAwMDAwMDAwIC0wNDAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvdGV4dGRvbWFpbi5jCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjU2NzAyMzM2IC0wNDAwCkBAIC0xLDUxICsxLDYwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGV4dGRvbWFpbigzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICAgIGFueSBsYXRlciB2ZXJzaW9uLgogCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKICMgaW5jbHVkZSA8Y29uZmlnLmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KICNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgogI2VuZGlmCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKIAogI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KKy8qIFdlIGhhdmUgdG8gaGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCisjIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+CiAjZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCisvKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUywgTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfd3Jsb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX3VubG9jayhOQU1FKQorI2VuZGlmCisKKy8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisgICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KKyNpZiAhZGVmaW5lZCBfTElCQworIyBkZWZpbmUgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluCisjIGRlZmluZSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4KICNlbmRpZgogCiAvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCiAKIC8qIE5hbWUgb2YgdGhlIGRlZmF1bHQgdGV4dCBkb21haW4uICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW5bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gYXR0cmlidXRlX2hpZGRlbjsKIAogLyogRGVmYXVsdCB0ZXh0IGRvbWFpbiBpbiB3aGljaCBlbnRyaWVzIGZvciBnZXR0ZXh0KDMpIGFyZSB0byBiZSBmb3VuZC4gICovCi1leHRlcm4gY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CitleHRlcm4gY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gYXR0cmlidXRlX2hpZGRlbjsKIAogCiAvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCkBAIC01NCw1MCArNjMsNzYgQEAKICAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCiAjaWZkZWYgX0xJQkMKICMgZGVmaW5lIFRFWFRET01BSU4gX190ZXh0ZG9tYWluCi0jIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQorIyBpZm5kZWYgc3RyZHVwCisjICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKKyMgZW5kaWYKICNlbHNlCi0jIGRlZmluZSBURVhURE9NQUlOIHRleHRkb21haW5fXworIyBkZWZpbmUgVEVYVERPTUFJTiBsaWJpbnRsX3RleHRkb21haW4KICNlbmRpZgogCisvKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KK19fbGliY19yd2xvY2tfZGVmaW5lIChleHRlcm4sIF9ubF9zdGF0ZV9sb2NrIGF0dHJpYnV0ZV9oaWRkZW4pCisKIC8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgogICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KICAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwogY2hhciAqCi1URVhURE9NQUlOIChkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOworVEVYVERPTUFJTiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSkKIHsKLSAgY2hhciAqb2xkOworICBjaGFyICpuZXdfZG9tYWluOworICBjaGFyICpvbGRfZG9tYWluOwogCiAgIC8qIEEgTlVMTCBwb2ludGVyIHJlcXVlc3RzIHRoZSBjdXJyZW50IHNldHRpbmcuICAqLwogICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQogICAgIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKIAotICBvbGQgPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKyAgX19saWJjX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICBvbGRfZG9tYWluID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CiAKICAgLyogSWYgZG9tYWluIG5hbWUgaXMgdGhlIG51bGwgc3RyaW5nIHNldCB0byBkZWZhdWx0IGRvbWFpbiAibWVzc2FnZXMiLiAgKi8KICAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJwogICAgICAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikgPT0gMCkKLSAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOworICAgIHsKKyAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47CisgICAgICBuZXdfZG9tYWluID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisgICAgfQorICBlbHNlIGlmIChzdHJjbXAgKGRvbWFpbm5hbWUsIG9sZF9kb21haW4pID09IDApCisgICAgLyogVGhpcyBjYW4gaGFwcGVuIGFuZCBwZW9wbGUgd2lsbCB1c2UgaXQgdG8gc2lnbmFsIHRoYXQgc29tZQorICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGNoYW5nZWQuICAqLworICAgIG5ld19kb21haW4gPSBvbGRfZG9tYWluOwogICBlbHNlCiAgICAgewogICAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBtYWxsb2MgZmFpbHMgYF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluJwogCSB3aWxsIGJlIE5VTEwuICBUaGlzIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHNvIHNpZ25hbHMgd2UKIAkgYXJlIG91dCBvZiBjb3JlLiAgKi8KICNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gc3RyZHVwIChkb21haW5uYW1lKTsKKyAgICAgIG5ld19kb21haW4gPSBzdHJkdXAgKGRvbWFpbm5hbWUpOwogI2Vsc2UKICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLSAgICAgIGNoYXIgKmNwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKGNwICE9IE5VTEwpCi0JbWVtY3B5IChjcCwgZG9tYWlubmFtZSwgbGVuKTsKLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gY3A7CisgICAgICBuZXdfZG9tYWluID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKKwltZW1jcHkgKG5ld19kb21haW4sIGRvbWFpbm5hbWUsIGxlbik7CiAjZW5kaWYKKworICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKKwlfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IG5ld19kb21haW47CiAgICAgfQogCi0gIGlmIChvbGQgIT0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4pCi0gICAgZnJlZSAob2xkKTsKKyAgLyogV2UgdXNlIHRoaXMgcG9zc2liaWxpdHkgdG8gc2lnbmFsIGEgY2hhbmdlIG9mIHRoZSBsb2FkZWQgY2F0YWxvZ3MKKyAgICAgc2luY2UgdGhpcyBpcyBtb3N0IGxpa2VseSB0aGUgY2FzZSBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgZWFzeSB3ZQorICAgICB0byBkbyBpdC4gIERvIGl0IG9ubHkgd2hlbiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCisgIGlmIChuZXdfZG9tYWluICE9IE5VTEwpCisgICAgeworICAgICAgKytfbmxfbXNnX2NhdF9jbnRyOwogCi0gIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKKyAgICAgIGlmIChvbGRfZG9tYWluICE9IG5ld19kb21haW4gJiYgb2xkX2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKKwlmcmVlIChvbGRfZG9tYWluKTsKKyAgICB9CisKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICByZXR1cm4gbmV3X2RvbWFpbjsKIH0KIAogI2lmZGVmIF9MSUJDCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC92YXNucHJpbnRmLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC92YXNucHJpbnRmLmMJMjAwNC0wOS0xMiAxNDo0MDozNC42NjI3MDE0MjQgLTA0MDAKQEAgLTAsMCArMSw4ODcgQEAKKy8qIHZzcHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIHNucHJpbnRmKCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2lmbmRlZiBJTl9MSUJJTlRMCisjIGluY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGluY2x1ZGUgInZhc253cHJpbnRmLmgiCisjZWxzZQorIyBpbmNsdWRlICJ2YXNucHJpbnRmLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIHNucHJpbnRmKCksIHNwcmludGYoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgkvKiBhYm9ydCgpLCBtYWxsb2MoKSwgcmVhbGxvYygpLCBmcmVlKCkgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4JLyogbWVtY3B5KCksIHN0cmxlbigpICovCisjaW5jbHVkZSA8ZXJybm8uaD4JLyogZXJybm8gKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4JLyogQ0hBUl9CSVQgKi8KKyNpbmNsdWRlIDxmbG9hdC5oPgkvKiBEQkxfTUFYX0VYUCwgTERCTF9NQVhfRVhQICovCisjaWYgV0lERV9DSEFSX1ZFUlNJT04KKyMgaW5jbHVkZSAid3ByaW50Zi1wYXJzZS5oIgorI2Vsc2UKKyMgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCisjZW5kaWYKKworLyogQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLiAgKi8KKyNpbmNsdWRlICJ4c2l6ZS5oIgorCisjaWZkZWYgSEFWRV9XQ0hBUl9UCisjIGlmZGVmIEhBVkVfV0NTTEVOCisjICBkZWZpbmUgbG9jYWxfd2NzbGVuIHdjc2xlbgorIyBlbHNlCisgICAvKiBTb2xhcmlzIDIuNS4xIGhhcyB3Y3NsZW4oKSBpbiBhIHNlcGFyYXRlIGxpYnJhcnkgbGlidy5zby4gVG8gYXZvaWQKKyAgICAgIGEgZGVwZW5kZW5jeSB0b3dhcmRzIHRoaXMgbGlicmFyeSwgaGVyZSBpcyBhIGxvY2FsIHN1YnN0aXR1dGUuCisgICAgICBEZWZpbmUgdGhpcyBzdWJzdGl0dXRlIG9ubHkgb25jZSwgZXZlbiBpZiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQKKyAgICAgIHR3aWNlIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQuICAqLworIyAgaWZuZGVmIGxvY2FsX3djc2xlbl9kZWZpbmVkCisjICAgZGVmaW5lIGxvY2FsX3djc2xlbl9kZWZpbmVkIDEKK3N0YXRpYyBzaXplX3QKK2xvY2FsX3djc2xlbiAoY29uc3Qgd2NoYXJfdCAqcykKK3sKKyAgY29uc3Qgd2NoYXJfdCAqcHRyOworCisgIGZvciAocHRyID0gczsgKnB0ciAhPSAod2NoYXJfdCkgMDsgcHRyKyspCisgICAgOworICByZXR1cm4gcHRyIC0gczsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGRlZmluZSBWQVNOUFJJTlRGIHZhc253cHJpbnRmCisjIGRlZmluZSBDSEFSX1Qgd2NoYXJfdAorIyBkZWZpbmUgRElSRUNUSVZFIHdjaGFyX3RfZGlyZWN0aXZlCisjIGRlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcworIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHdwcmludGZfcGFyc2UKKyMgZGVmaW5lIFVTRV9TTlBSSU5URiAxCisjIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCisgICAvKiBPbiBXaW5kb3dzLCB0aGUgZnVuY3Rpb24gc3dwcmludGYoKSBoYXMgYSBkaWZmZXJlbnQgc2lnbmF0dXJlIHRoYW4KKyAgICAgIG9uIFVuaXg7IHdlIHVzZSB0aGUgX3Nud3ByaW50ZigpIGZ1bmN0aW9uIGluc3RlYWQuICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIF9zbndwcmludGYKKyMgZWxzZQorICAgLyogVW5peC4gICovCisjICBkZWZpbmUgU05QUklOVEYgc3dwcmludGYKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBWQVNOUFJJTlRGIHZhc25wcmludGYKKyMgZGVmaW5lIENIQVJfVCBjaGFyCisjIGRlZmluZSBESVJFQ1RJVkUgY2hhcl9kaXJlY3RpdmUKKyMgZGVmaW5lIERJUkVDVElWRVMgY2hhcl9kaXJlY3RpdmVzCisjIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCisjIGRlZmluZSBVU0VfU05QUklOVEYgKEhBVkVfREVDTF9fU05QUklOVEYgfHwgSEFWRV9TTlBSSU5URikKKyMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgorICAgLyogV2luZG93cy4gICovCisjICBkZWZpbmUgU05QUklOVEYgX3NucHJpbnRmCisjIGVsc2UKKyAgIC8qIFVuaXguICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIHNucHJpbnRmCisjIGVuZGlmCisjZW5kaWYKKworQ0hBUl9UICoKK1ZBU05QUklOVEYgKENIQVJfVCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IENIQVJfVCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIERJUkVDVElWRVMgZDsKKyAgYXJndW1lbnRzIGE7CisKKyAgaWYgKFBSSU5URl9QQVJTRSAoZm9ybWF0LCAmZCwgJmEpIDwgMCkKKyAgICB7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2RlZmluZSBDTEVBTlVQKCkgXAorICBmcmVlIChkLmRpcik7CQkJCQkJCQlcCisgIGlmIChhLmFyZykJCQkJCQkJCVwKKyAgICBmcmVlIChhLmFyZyk7CisKKyAgaWYgKHByaW50Zl9mZXRjaGFyZ3MgKGFyZ3MsICZhKSA8IDApCisgICAgeworICAgICAgQ0xFQU5VUCAoKTsKKyAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHsKKyAgICBzaXplX3QgYnVmX25lZWRlZGxlbmd0aDsKKyAgICBDSEFSX1QgKmJ1ZjsKKyAgICBDSEFSX1QgKmJ1Zl9tYWxsb2NlZDsKKyAgICBjb25zdCBDSEFSX1QgKmNwOworICAgIHNpemVfdCBpOworICAgIERJUkVDVElWRSAqZHA7CisgICAgLyogT3V0cHV0IHN0cmluZyBhY2N1bXVsYXRvci4gICovCisgICAgQ0hBUl9UICpyZXN1bHQ7CisgICAgc2l6ZV90IGFsbG9jYXRlZDsKKyAgICBzaXplX3QgbGVuZ3RoOworCisgICAgLyogQWxsb2NhdGUgYSBzbWFsbCBidWZmZXIgdGhhdCB3aWxsIGhvbGQgYSBkaXJlY3RpdmUgcGFzc2VkIHRvCisgICAgICAgc3ByaW50ZiBvciBzbnByaW50Zi4gICovCisgICAgYnVmX25lZWRlZGxlbmd0aCA9CisgICAgICB4c3VtNCAoNywgZC5tYXhfd2lkdGhfbGVuZ3RoLCBkLm1heF9wcmVjaXNpb25fbGVuZ3RoLCA2KTsKKyNpZiBIQVZFX0FMTE9DQQorICAgIGlmIChidWZfbmVlZGVkbGVuZ3RoIDwgNDAwMCAvIHNpemVvZiAoQ0hBUl9UKSkKKyAgICAgIHsKKwlidWYgPSAoQ0hBUl9UICopIGFsbG9jYSAoYnVmX25lZWRlZGxlbmd0aCAqIHNpemVvZiAoQ0hBUl9UKSk7CisJYnVmX21hbGxvY2VkID0gTlVMTDsKKyAgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsKKwlzaXplX3QgYnVmX21lbXNpemUgPSB4dGltZXMgKGJ1Zl9uZWVkZWRsZW5ndGgsIHNpemVvZiAoQ0hBUl9UKSk7CisJaWYgKHNpemVfb3ZlcmZsb3dfcCAoYnVmX21lbXNpemUpKQorCSAgZ290byBvdXRfb2ZfbWVtb3J5XzE7CisJYnVmID0gKENIQVJfVCAqKSBtYWxsb2MgKGJ1Zl9tZW1zaXplKTsKKwlpZiAoYnVmID09IE5VTEwpCisJICBnb3RvIG91dF9vZl9tZW1vcnlfMTsKKwlidWZfbWFsbG9jZWQgPSBidWY7CisgICAgICB9CisKKyAgICBpZiAocmVzdWx0YnVmICE9IE5VTEwpCisgICAgICB7CisJcmVzdWx0ID0gcmVzdWx0YnVmOworCWFsbG9jYXRlZCA9ICpsZW5ndGhwOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlyZXN1bHQgPSBOVUxMOworCWFsbG9jYXRlZCA9IDA7CisgICAgICB9CisgICAgbGVuZ3RoID0gMDsKKyAgICAvKiBJbnZhcmlhbnRzOgorICAgICAgIHJlc3VsdCBpcyBlaXRoZXIgPT0gcmVzdWx0YnVmIG9yID09IE5VTEwgb3IgbWFsbG9jLWFsbG9jYXRlZC4KKyAgICAgICBJZiBsZW5ndGggPiAwLCB0aGVuIHJlc3VsdCAhPSBOVUxMLiAgKi8KKworICAgIC8qIEVuc3VyZXMgdGhhdCBhbGxvY2F0ZWQgPj0gbmVlZGVkLiAgQWJvcnRzIHRocm91Z2ggYSBqdW1wIHRvCisgICAgICAgb3V0X29mX21lbW9yeSBpZiBuZWVkZWQgaXMgU0laRV9NQVggb3Igb3RoZXJ3aXNlIHRvbyBiaWcuICAqLworI2RlZmluZSBFTlNVUkVfQUxMT0NBVElPTihuZWVkZWQpIFwKKyAgICBpZiAoKG5lZWRlZCkgPiBhbGxvY2F0ZWQpCQkJCQkJICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICBcCisJc2l6ZV90IG1lbW9yeV9zaXplOwkJCQkJCSAgICAgXAorCUNIQVJfVCAqbWVtb3J5OwkJCQkJCQkgICAgIFwKKwkJCQkJCQkJCSAgICAgXAorCWFsbG9jYXRlZCA9IChhbGxvY2F0ZWQgPiAwID8geHRpbWVzIChhbGxvY2F0ZWQsIDIpIDogMTIpOwkgICAgIFwKKwlpZiAoKG5lZWRlZCkgPiBhbGxvY2F0ZWQpCQkJCQkgICAgIFwKKwkgIGFsbG9jYXRlZCA9IChuZWVkZWQpOwkJCQkJCSAgICAgXAorCW1lbW9yeV9zaXplID0geHRpbWVzIChhbGxvY2F0ZWQsIHNpemVvZiAoQ0hBUl9UKSk7CQkgICAgIFwKKwlpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCQkJCSAgICAgXAorCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCSAgICAgXAorCWlmIChyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKQkJCSAgICAgXAorCSAgbWVtb3J5ID0gKENIQVJfVCAqKSBtYWxsb2MgKG1lbW9yeV9zaXplKTsJCQkgICAgIFwKKwllbHNlCQkJCQkJCQkgICAgIFwKKwkgIG1lbW9yeSA9IChDSEFSX1QgKikgcmVhbGxvYyAocmVzdWx0LCBtZW1vcnlfc2l6ZSk7CQkgICAgIFwKKwlpZiAobWVtb3J5ID09IE5VTEwpCQkJCQkJICAgICBcCisJICBnb3RvIG91dF9vZl9tZW1vcnk7CQkJCQkJICAgICBcCisJaWYgKHJlc3VsdCA9PSByZXN1bHRidWYgJiYgbGVuZ3RoID4gMCkJCQkJICAgICBcCisJICBtZW1jcHkgKG1lbW9yeSwgcmVzdWx0LCBsZW5ndGggKiBzaXplb2YgKENIQVJfVCkpOwkJICAgICBcCisJcmVzdWx0ID0gbWVtb3J5OwkJCQkJCSAgICAgXAorICAgICAgfQorCisgICAgZm9yIChjcCA9IGZvcm1hdCwgaSA9IDAsIGRwID0gJmQuZGlyWzBdOyA7IGNwID0gZHAtPmRpcl9lbmQsIGkrKywgZHArKykKKyAgICAgIHsKKwlpZiAoY3AgIT0gZHAtPmRpcl9zdGFydCkKKwkgIHsKKwkgICAgc2l6ZV90IG4gPSBkcC0+ZGlyX3N0YXJ0IC0gY3A7CisJICAgIHNpemVfdCBhdWdtZW50ZWRfbGVuZ3RoID0geHN1bSAobGVuZ3RoLCBuKTsKKworCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoYXVnbWVudGVkX2xlbmd0aCk7CisJICAgIG1lbWNweSAocmVzdWx0ICsgbGVuZ3RoLCBjcCwgbiAqIHNpemVvZiAoQ0hBUl9UKSk7CisJICAgIGxlbmd0aCA9IGF1Z21lbnRlZF9sZW5ndGg7CisJICB9CisJaWYgKGkgPT0gZC5jb3VudCkKKwkgIGJyZWFrOworCisJLyogRXhlY3V0ZSBhIHNpbmdsZSBkaXJlY3RpdmUuICAqLworCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnJScpCisJICB7CisJICAgIHNpemVfdCBhdWdtZW50ZWRfbGVuZ3RoOworCisJICAgIGlmICghKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpKQorCSAgICAgIGFib3J0ICgpOworCSAgICBhdWdtZW50ZWRfbGVuZ3RoID0geHN1bSAobGVuZ3RoLCAxKTsKKwkgICAgRU5TVVJFX0FMTE9DQVRJT04gKGF1Z21lbnRlZF9sZW5ndGgpOworCSAgICByZXN1bHRbbGVuZ3RoXSA9ICclJzsKKwkgICAgbGVuZ3RoID0gYXVnbWVudGVkX2xlbmd0aDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmICghKGRwLT5hcmdfaW5kZXggIT0gQVJHX05PTkUpKQorCSAgICAgIGFib3J0ICgpOworCisJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnbicpCisJICAgICAgeworCQlzd2l0Y2ggKGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUpCisJCSAgeworCQkgIGNhc2UgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOgorCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X3Nob3J0X3BvaW50ZXIgPSBsZW5ndGg7CisJCSAgICBicmVhazsKKwkJICBjYXNlIFRZUEVfQ09VTlRfSU5UX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2ludF9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjoKKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBjYXNlIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjoKKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworI2VuZGlmCisJCSAgZGVmYXVsdDoKKwkJICAgIGFib3J0ICgpOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWFyZ190eXBlIHR5cGUgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlOworCQlDSEFSX1QgKnA7CisJCXVuc2lnbmVkIGludCBwcmVmaXhfY291bnQ7CisJCWludCBwcmVmaXhlc1syXTsKKyNpZiAhVVNFX1NOUFJJTlRGCisJCXNpemVfdCB0bXBfbGVuZ3RoOworCQlDSEFSX1QgdG1wYnVmWzcwMF07CisJCUNIQVJfVCAqdG1wOworCisJCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUgZm9yIGNhbGxpbmcKKwkJICAgc3ByaW50Zi4gICovCisJCXsKKwkJICBzaXplX3Qgd2lkdGg7CisJCSAgc2l6ZV90IHByZWNpc2lvbjsKKworCQkgIHdpZHRoID0gMDsKKwkJICBpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCisJCSAgICB7CisJCSAgICAgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQorCQkJeworCQkJICBpbnQgYXJnOworCisJCQkgIGlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorCQkJICAgIGFib3J0ICgpOworCQkJICBhcmcgPSBhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS5hLmFfaW50OworCQkJICB3aWR0aCA9IChhcmcgPCAwID8gKHVuc2lnbmVkIGludCkgKC1hcmcpIDogYXJnKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBjb25zdCBDSEFSX1QgKmRpZ2l0cCA9IGRwLT53aWR0aF9zdGFydDsKKworCQkJICBkbworCQkJICAgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOworCQkJICB3aGlsZSAoZGlnaXRwICE9IGRwLT53aWR0aF9lbmQpOworCQkJfQorCQkgICAgfQorCisJCSAgcHJlY2lzaW9uID0gNjsKKwkJICBpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQorCQkJeworCQkJICBpbnQgYXJnOworCisJCQkgIGlmICghKGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKKwkJCSAgICBhYm9ydCAoKTsKKwkJCSAgYXJnID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7CisJCQkgIHByZWNpc2lvbiA9IChhcmcgPCAwID8gMCA6IGFyZyk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgY29uc3QgQ0hBUl9UICpkaWdpdHAgPSBkcC0+cHJlY2lzaW9uX3N0YXJ0ICsgMTsKKworCQkJICBwcmVjaXNpb24gPSAwOworCQkJICBkbworCQkJICAgIHByZWNpc2lvbiA9IHhzdW0gKHh0aW1lcyAocHJlY2lzaW9uLCAxMCksICpkaWdpdHArKyAtICcwJyk7CisJCQkgIHdoaWxlIChkaWdpdHAgIT0gZHAtPnByZWNpc2lvbl9lbmQpOworCQkJfQorCQkgICAgfQorCisJCSAgc3dpdGNoIChkcC0+Y29udmVyc2lvbikKKwkJICAgIHsKKworCQkgICAgY2FzZSAnZCc6IGNhc2UgJ2knOiBjYXNlICd1JzoKKyMgaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLworCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGVsc2UKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdvJzoKKyMgaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBlbHNlCisjIGVuZGlmCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBlbHNlCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICd4JzogY2FzZSAnWCc6CisjIGlmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybSAqLworCQkgICAgICBlbHNlCisjIGVuZGlmCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduIG9yIGFsdGVybmF0ZSBmb3JtICovCisJCSAgICAgIGVsc2UKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybSAqLworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnZic6IGNhc2UgJ0YnOgorIyBpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoTERCTF9NQVhfRVhQCisJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDEwOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChEQkxfTUFYX0VYUAorCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLworCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxMDsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCisJCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCBwcmVjaXNpb24pOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdnJzogY2FzZSAnRyc6CisJCSAgICBjYXNlICdhJzogY2FzZSAnQSc6CisJCSAgICAgIHRtcF9sZW5ndGggPQorCQkJMTI7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQsIGV4cG9uZW50IGV0Yy4gKi8KKwkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIHByZWNpc2lvbik7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdjJzoKKyMgaWYgZGVmaW5lZCBIQVZFX1dJTlRfVCAmJiAhV0lERV9DSEFSX1ZFUlNJT04KKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9XSURFX0NIQVIpCisJCQl0bXBfbGVuZ3RoID0gTUJfQ1VSX01BWDsKKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkJdG1wX2xlbmd0aCA9IDE7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdzJzoKKyMgaWZkZWYgSEFWRV9XQ0hBUl9UCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfV0lERV9TVFJJTkcpCisJCQl7CisJCQkgIHRtcF9sZW5ndGggPQorCQkJICAgIGxvY2FsX3djc2xlbiAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfc3RyaW5nKTsKKworIyAgaWYgIVdJREVfQ0hBUl9WRVJTSU9OCisJCQkgIHRtcF9sZW5ndGggPSB4dGltZXMgKHRtcF9sZW5ndGgsIE1CX0NVUl9NQVgpOworIyAgZW5kaWYKKwkJCX0KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkJdG1wX2xlbmd0aCA9IHN0cmxlbiAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3N0cmluZyk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdwJzoKKwkJICAgICAgdG1wX2xlbmd0aCA9CisJCQkodW5zaWduZWQgaW50KSAoc2l6ZW9mICh2b2lkICopICogQ0hBUl9CSVQKKwkJCQkJKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworCQkJCSAgICAgICApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgMHggKi8KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGFib3J0ICgpOworCQkgICAgfQorCisJCSAgaWYgKHRtcF9sZW5ndGggPCB3aWR0aCkKKwkJICAgIHRtcF9sZW5ndGggPSB3aWR0aDsKKworCQkgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsgLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgTlVMICovCisJCX0KKworCQlpZiAodG1wX2xlbmd0aCA8PSBzaXplb2YgKHRtcGJ1ZikgLyBzaXplb2YgKENIQVJfVCkpCisJCSAgdG1wID0gdG1wYnVmOworCQllbHNlCisJCSAgeworCQkgICAgc2l6ZV90IHRtcF9tZW1zaXplID0geHRpbWVzICh0bXBfbGVuZ3RoLCBzaXplb2YgKENIQVJfVCkpOworCisJCSAgICBpZiAoc2l6ZV9vdmVyZmxvd19wICh0bXBfbWVtc2l6ZSkpCisJCSAgICAgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLworCQkgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisJCSAgICB0bXAgPSAoQ0hBUl9UICopIG1hbGxvYyAodG1wX21lbXNpemUpOworCQkgICAgaWYgKHRtcCA9PSBOVUxMKQorCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KKwkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworCQkgIH0KKyNlbmRpZgorCisJCS8qIENvbnN0cnVjdCB0aGUgZm9ybWF0IHN0cmluZyBmb3IgY2FsbGluZyBzbnByaW50ZiBvcgorCQkgICBzcHJpbnRmLiAgKi8KKwkJcCA9IGJ1ZjsKKwkJKnArKyA9ICclJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfR1JPVVApCisJCSAgKnArKyA9ICdcJyc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpCisJCSAgKnArKyA9ICctJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfU0hPV1NJR04pCisJCSAgKnArKyA9ICcrJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfU1BBQ0UpCisJCSAgKnArKyA9ICcgJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfQUxUKQorCQkgICpwKysgPSAnIyc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX1pFUk8pCisJCSAgKnArKyA9ICcwJzsKKwkJaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQorCQkgIHsKKwkJICAgIHNpemVfdCBuID0gZHAtPndpZHRoX2VuZCAtIGRwLT53aWR0aF9zdGFydDsKKwkJICAgIG1lbWNweSAocCwgZHAtPndpZHRoX3N0YXJ0LCBuICogc2l6ZW9mIChDSEFSX1QpKTsKKwkJICAgIHAgKz0gbjsKKwkJICB9CisJCWlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQorCQkgIHsKKwkJICAgIHNpemVfdCBuID0gZHAtPnByZWNpc2lvbl9lbmQgLSBkcC0+cHJlY2lzaW9uX3N0YXJ0OworCQkgICAgbWVtY3B5IChwLCBkcC0+cHJlY2lzaW9uX3N0YXJ0LCBuICogc2l6ZW9mIChDSEFSX1QpKTsKKwkJICAgIHAgKz0gbjsKKwkJICB9CisKKwkJc3dpdGNoICh0eXBlKQorCQkgIHsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKKwkJICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgorCQkgICAgKnArKyA9ICdsJzsKKwkJICAgIC8qRkFMTFRIUk9VR0gqLworI2VuZGlmCisJCSAgY2FzZSBUWVBFX0xPTkdJTlQ6CisJCSAgY2FzZSBUWVBFX1VMT05HSU5UOgorI2lmZGVmIEhBVkVfV0lOVF9UCisJCSAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKKyNlbmRpZgorI2lmZGVmIEhBVkVfV0NIQVJfVAorCQkgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKKyNlbmRpZgorCQkgICAgKnArKyA9ICdsJzsKKwkJICAgIGJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKwkJICBjYXNlIFRZUEVfTE9OR0RPVUJMRToKKwkJICAgICpwKysgPSAnTCc7CisJCSAgICBicmVhazsKKyNlbmRpZgorCQkgIGRlZmF1bHQ6CisJCSAgICBicmVhazsKKwkJICB9CisJCSpwID0gZHAtPmNvbnZlcnNpb247CisjaWYgVVNFX1NOUFJJTlRGCisJCXBbMV0gPSAnJSc7CisJCXBbMl0gPSAnbic7CisJCXBbM10gPSAnXDAnOworI2Vsc2UKKwkJcFsxXSA9ICdcMCc7CisjZW5kaWYKKworCQkvKiBDb25zdHJ1Y3QgdGhlIGFyZ3VtZW50cyBmb3IgY2FsbGluZyBzbnByaW50ZiBvciBzcHJpbnRmLiAgKi8KKwkJcHJlZml4X2NvdW50ID0gMDsKKwkJaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCisJCSAgeworCQkgICAgaWYgKCEoYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCisJCSAgICAgIGFib3J0ICgpOworCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKKwkJICB9CisJCWlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKwkJICB7CisJCSAgICBpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCisJCSAgICAgIGFib3J0ICgpOworCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7CisJCSAgfQorCisjaWYgVVNFX1NOUFJJTlRGCisJCS8qIFByZXBhcmUgY2hlY2tpbmcgd2hldGhlciBzbnByaW50ZiByZXR1cm5zIHRoZSBjb3VudAorCQkgICB2aWEgJW4uICAqLworCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7CisJCXJlc3VsdFtsZW5ndGhdID0gJ1wwJzsKKyNlbmRpZgorCisJCWZvciAoOzspCisJCSAgeworCQkgICAgc2l6ZV90IG1heGxlbjsKKwkJICAgIGludCBjb3VudDsKKwkJICAgIGludCByZXRjb3VudDsKKworCQkgICAgbWF4bGVuID0gYWxsb2NhdGVkIC0gbGVuZ3RoOworCQkgICAgY291bnQgPSAtMTsKKwkJICAgIHJldGNvdW50ID0gMDsKKworI2lmIFVTRV9TTlBSSU5URgorIyBkZWZpbmUgU05QUklOVEZfQlVGKGFyZykgXAorCQkgICAgc3dpdGNoIChwcmVmaXhfY291bnQpCQkJCSAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAwOgkJCQkJCSAgICBcCisJCQlyZXRjb3VudCA9IFNOUFJJTlRGIChyZXN1bHQgKyBsZW5ndGgsIG1heGxlbiwgYnVmLCAgXAorCQkJCQkgICAgIGFyZywgJmNvdW50KTsJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDE6CQkJCQkJICAgIFwKKwkJCXJldGNvdW50ID0gU05QUklOVEYgKHJlc3VsdCArIGxlbmd0aCwgbWF4bGVuLCBidWYsICBcCisJCQkJCSAgICAgcHJlZml4ZXNbMF0sIGFyZywgJmNvdW50KTsJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgXAorCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKKwkJCQkJICAgICBwcmVmaXhlc1swXSwgcHJlZml4ZXNbMV0sIGFyZywgXAorCQkJCQkgICAgICZjb3VudCk7CQkJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGRlZmF1bHQ6CQkJCQkJICAgIFwKKwkJCWFib3J0ICgpOwkJCQkJICAgIFwKKwkJICAgICAgfQorI2Vsc2UKKyMgZGVmaW5lIFNOUFJJTlRGX0JVRihhcmcpIFwKKwkJICAgIHN3aXRjaCAocHJlZml4X2NvdW50KQkJCQkgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMDoJCQkJCQkgICAgXAorCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgYXJnKTsJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDE6CQkJCQkJICAgIFwKKwkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIHByZWZpeGVzWzBdLCBhcmcpOwkgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAyOgkJCQkJCSAgICBcCisJCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBwcmVmaXhlc1swXSwgcHJlZml4ZXNbMV0sXAorCQkJCQkgYXJnKTsJCQkJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGRlZmF1bHQ6CQkJCQkJICAgIFwKKwkJCWFib3J0ICgpOwkJCQkJICAgIFwKKwkJICAgICAgfQorI2VuZGlmCisKKwkJICAgIHN3aXRjaCAodHlwZSkKKwkJICAgICAgeworCQkgICAgICBjYXNlIFRZUEVfU0NIQVI6CisJCQl7CisJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc2NoYXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfVUNIQVI6CisJCQl7CisJCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWNoYXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfU0hPUlQ6CisJCQl7CisJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc2hvcnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfVVNIT1JUOgorCQkJeworCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VzaG9ydDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9JTlQ6CisJCQl7CisJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfaW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VJTlQ6CisJCQl7CisJCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9MT05HSU5UOgorCQkJeworCQkJICBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9VTE9OR0lOVDoKKwkJCXsKKwkJCSAgdW5zaWduZWQgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Vsb25naW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgICAgICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6CisJCQl7CisJCQkgIGxvbmcgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdsb25naW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKKwkJCXsKKwkJCSAgdW5zaWduZWQgbG9uZyBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWxvbmdsb25naW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorCQkJeworCQkJICBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2RvdWJsZTsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorCQkgICAgICBjYXNlIFRZUEVfTE9OR0RPVUJMRToKKwkJCXsKKwkJCSAgbG9uZyBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGU7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCSAgICAgIGNhc2UgVFlQRV9DSEFSOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NoYXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIEhBVkVfV0lOVF9UCisJCSAgICAgIGNhc2UgVFlQRV9XSURFX0NIQVI6CisJCQl7CisJCQkgIHdpbnRfdCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9jaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfU1RSSU5HOgorCQkJeworCQkJICBjb25zdCBjaGFyICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc3RyaW5nOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKwkJICAgICAgY2FzZSBUWVBFX1dJREVfU1RSSU5HOgorCQkJeworCQkJICBjb25zdCB3Y2hhcl90ICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9zdHJpbmc7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCSAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgorCQkJeworCQkJICB2b2lkICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfcG9pbnRlcjsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGRlZmF1bHQ6CisJCQlhYm9ydCAoKTsKKwkJICAgICAgfQorCisjaWYgVVNFX1NOUFJJTlRGCisJCSAgICAvKiBQb3J0YWJpbGl0eTogTm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgb2Ygc25wcmludGYoKQorCQkgICAgICAgYXJlIElTTyBDIDk5IGNvbXBsaWFudC4gIERldGVybWluZSB0aGUgbnVtYmVyIG9mCisJCSAgICAgICBieXRlcyB0aGF0IHNucHJpbnRmKCkgaGFzIHByb2R1Y2VkIG9yIHdvdWxkIGhhdmUKKwkJICAgICAgIHByb2R1Y2VkLiAgKi8KKwkJICAgIGlmIChjb3VudCA+PSAwKQorCQkgICAgICB7CisJCQkvKiBWZXJpZnkgdGhhdCBzbnByaW50ZigpIGhhcyBOVUwtdGVybWluYXRlZCBpdHMKKwkJCSAgIHJlc3VsdC4gICovCisJCQlpZiAoY291bnQgPCBtYXhsZW4gJiYgcmVzdWx0W2xlbmd0aCArIGNvdW50XSAhPSAnXDAnKQorCQkJICBhYm9ydCAoKTsKKwkJCS8qIFBvcnRhYmlsaXR5IGhhY2suICAqLworCQkJaWYgKHJldGNvdW50ID4gY291bnQpCisJCQkgIGNvdW50ID0gcmV0Y291bnQ7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJLyogc25wcmludGYoKSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicKKwkJCSAgIGRpcmVjdGl2ZS4gICovCisJCQlpZiAocFsxXSAhPSAnXDAnKQorCQkJICB7CisJCQkgICAgLyogRG9uJ3QgdXNlIHRoZSAnJW4nIGRpcmVjdGl2ZTsgaW5zdGVhZCwgbG9vaworCQkJICAgICAgIGF0IHRoZSBzbnByaW50ZigpIHJldHVybiB2YWx1ZS4gICovCisJCQkgICAgcFsxXSA9ICdcMCc7CisJCQkgICAgY29udGludWU7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgIC8qIExvb2sgYXQgdGhlIHNucHJpbnRmKCkgcmV0dXJuIHZhbHVlLiAgKi8KKwkJCSAgICBpZiAocmV0Y291bnQgPCAwKQorCQkJICAgICAgeworCQkJCS8qIEhQLVVYIDEwLjIwIHNucHJpbnRmKCkgaXMgZG91Ymx5IGRlZmljaWVudDoKKwkJCQkgICBJdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicgZGlyZWN0aXZlLAorCQkJCSAgICphbmQqIGl0IHJldHVybnMgLTEgKHJhdGhlciB0aGFuIHRoZSBsZW5ndGgKKwkJCQkgICB0aGF0IHdvdWxkIGhhdmUgYmVlbiByZXF1aXJlZCkgd2hlbiB0aGUKKwkJCQkgICBidWZmZXIgaXMgdG9vIHNtYWxsLiAgKi8KKwkJCQlzaXplX3QgYmlnZ2VyX25lZWQgPQorCQkJCSAgeHN1bSAoeHRpbWVzIChhbGxvY2F0ZWQsIDIpLCAxMik7CisJCQkJRU5TVVJFX0FMTE9DQVRJT04gKGJpZ2dlcl9uZWVkKTsKKwkJCQljb250aW51ZTsKKwkJCSAgICAgIH0KKwkJCSAgICBlbHNlCisJCQkgICAgICBjb3VudCA9IHJldGNvdW50OworCQkJICB9CisJCSAgICAgIH0KKyNlbmRpZgorCisJCSAgICAvKiBBdHRlbXB0IHRvIGhhbmRsZSBmYWlsdXJlLiAgKi8KKwkJICAgIGlmIChjb3VudCA8IDApCisJCSAgICAgIHsKKwkJCWlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQorCQkJICBmcmVlIChyZXN1bHQpOworCQkJaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQorCQkJICBmcmVlIChidWZfbWFsbG9jZWQpOworCQkJQ0xFQU5VUCAoKTsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIE5VTEw7CisJCSAgICAgIH0KKworI2lmICFVU0VfU05QUklOVEYKKwkJICAgIGlmIChjb3VudCA+PSB0bXBfbGVuZ3RoKQorCQkgICAgICAvKiB0bXBfbGVuZ3RoIHdhcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIC0gZml4IHRoZQorCQkJIGNvZGUgYWJvdmUhICAqLworCQkgICAgICBhYm9ydCAoKTsKKyNlbmRpZgorCisJCSAgICAvKiBNYWtlIHJvb20gZm9yIHRoZSByZXN1bHQuICAqLworCQkgICAgaWYgKGNvdW50ID49IG1heGxlbikKKwkJICAgICAgeworCQkJLyogTmVlZCBhdCBsZWFzdCBjb3VudCBieXRlcy4gIEJ1dCBhbGxvY2F0ZQorCQkJICAgcHJvcG9ydGlvbmFsbHksIHRvIGF2b2lkIGxvb3BpbmcgZXRlcm5hbGx5IGlmCisJCQkgICBzbnByaW50ZigpIHJlcG9ydHMgYSB0b28gc21hbGwgY291bnQuICAqLworCQkJc2l6ZV90IG4gPQorCQkJICB4bWF4ICh4c3VtIChsZW5ndGgsIGNvdW50KSwgeHRpbWVzIChhbGxvY2F0ZWQsIDIpKTsKKworCQkJRU5TVVJFX0FMTE9DQVRJT04gKG4pOworI2lmIFVTRV9TTlBSSU5URgorCQkJY29udGludWU7CisjZW5kaWYKKwkJICAgICAgfQorCisjaWYgVVNFX1NOUFJJTlRGCisJCSAgICAvKiBUaGUgc25wcmludGYoKSByZXN1bHQgZGlkIGZpdC4gICovCisjZWxzZQorCQkgICAgLyogQXBwZW5kIHRoZSBzcHJpbnRmKCkgcmVzdWx0LiAgKi8KKwkJICAgIG1lbWNweSAocmVzdWx0ICsgbGVuZ3RoLCB0bXAsIGNvdW50ICogc2l6ZW9mIChDSEFSX1QpKTsKKwkJICAgIGlmICh0bXAgIT0gdG1wYnVmKQorCQkgICAgICBmcmVlICh0bXApOworI2VuZGlmCisKKwkJICAgIGxlbmd0aCArPSBjb3VudDsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICAvKiBBZGQgdGhlIGZpbmFsIE5VTC4gICovCisgICAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgMSkpOworICAgIHJlc3VsdFtsZW5ndGhdID0gJ1wwJzsKKworICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmICYmIGxlbmd0aCArIDEgPCBhbGxvY2F0ZWQpCisgICAgICB7CisJLyogU2hyaW5rIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlmIHBvc3NpYmxlLiAgKi8KKwlDSEFSX1QgKm1lbW9yeTsKKworCW1lbW9yeSA9IChDSEFSX1QgKikgcmVhbGxvYyAocmVzdWx0LCAobGVuZ3RoICsgMSkgKiBzaXplb2YgKENIQVJfVCkpOworCWlmIChtZW1vcnkgIT0gTlVMTCkKKwkgIHJlc3VsdCA9IG1lbW9yeTsKKyAgICAgIH0KKworICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKKyAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7CisgICAgQ0xFQU5VUCAoKTsKKyAgICAqbGVuZ3RocCA9IGxlbmd0aDsKKyAgICByZXR1cm4gcmVzdWx0OworCisgIG91dF9vZl9tZW1vcnk6CisgICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCisgICAgICBmcmVlIChyZXN1bHQpOworICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKKyAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7CisgIG91dF9vZl9tZW1vcnlfMToKKyAgICBDTEVBTlVQICgpOworICAgIGVycm5vID0gRU5PTUVNOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKyN1bmRlZiBTTlBSSU5URgorI3VuZGVmIFVTRV9TTlBSSU5URgorI3VuZGVmIFBSSU5URl9QQVJTRQorI3VuZGVmIERJUkVDVElWRVMKKyN1bmRlZiBESVJFQ1RJVkUKKyN1bmRlZiBDSEFSX1QKKyN1bmRlZiBWQVNOUFJJTlRGCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvaW50bC92YXNucHJpbnRmLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC92YXNucHJpbnRmLmgJMjAwNC0wOS0xMiAxNDo0MDozNC42Njc3MDA2NjQgLTA0MDAKQEAgLTAsMCArMSw2MSBAQAorLyogdnNwcmludGYgd2l0aCBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1ZBU05QUklOVEZfSAorI2RlZmluZSBfVkFTTlBSSU5URl9ICisKKy8qIEdldCB2YV9saXN0LiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogR2V0IHNpemVfdC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZm5kZWYgX19hdHRyaWJ1dGVfXworLyogVGhpcyBmZWF0dXJlIGlzIGF2YWlsYWJsZSBpbiBnY2MgdmVyc2lvbnMgMi41IGFuZCBsYXRlci4gICovCisjIGlmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDUpIHx8IF9fU1RSSUNUX0FOU0lfXworIyAgZGVmaW5lIF9fYXR0cmlidXRlX18oU3BlYykgLyogZW1wdHkgKi8KKyMgZW5kaWYKKy8qIFRoZSBfXy1wcm90ZWN0ZWQgdmFyaWFudHMgb2YgYGZvcm1hdCcgYW5kIGBwcmludGYnIGF0dHJpYnV0ZXMKKyAgIGFyZSBhY2NlcHRlZCBieSBnY2MgdmVyc2lvbnMgMi42LjQgKGVmZmVjdGl2ZWx5IDIuNykgYW5kIGxhdGVyLiAgKi8KKyMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykKKyMgIGRlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAorIyAgZGVmaW5lIF9fcHJpbnRmX18gcHJpbnRmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgorICAgWW91IGNhbiBwYXNzIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpbiBSRVNVTFRCVUYgYW5kIGl0cworICAgc2l6ZSBpbiAqTEVOR1RIUDsgb3RoZXJ3aXNlIHlvdSBwYXNzIFJFU1VMVEJVRiA9IE5VTEwuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyAodGhpcyBtYXkgYmUgPSBSRVNVTFRCVUYKKyAgIGlmIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gd2FzIG5lY2Vzc2FyeSkgYW5kIHNldCAqTEVOR1RIUCB0byB0aGUKKyAgIG51bWJlciBvZiByZXN1bHRpbmcgYnl0ZXMsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgVXBvbiBlcnJvciwgc2V0CisgICBlcnJubyBhbmQgcmV0dXJuIE5VTEwuICAqLworZXh0ZXJuIGNoYXIgKiBhc25wcmludGYgKGNoYXIgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKyAgICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgNCkpKTsKK2V4dGVybiBjaGFyICogdmFzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorICAgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1ZBU05QUklOVEZfSCAqLwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvdmFzbndwcmludGYuaAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL3Zhc253cHJpbnRmLmgJMjAwNC0wOS0xMiAxNDo0MDozNC42NzM2OTk3NTIgLTA0MDAKQEAgLTAsMCArMSw0NiBAQAorLyogdnN3cHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9WQVNOV1BSSU5URl9ICisjZGVmaW5lIF9WQVNOV1BSSU5URl9ICisKKy8qIEdldCB2YV9saXN0LiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogR2V0IHdjaGFyX3QsIHNpemVfdC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBhIHN0cmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MoKS4KKyAgIFlvdSBjYW4gcGFzcyBhIHByZWFsbG9jYXRlZCBidWZmZXIgZm9yIHRoZSByZXN1bHQgaW4gUkVTVUxUQlVGIGFuZCBpdHMKKyAgIHNpemUgaW4gKkxFTkdUSFA7IG90aGVyd2lzZSB5b3UgcGFzcyBSRVNVTFRCVUYgPSBOVUxMLgorICAgSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJpbmcgKHRoaXMgbWF5IGJlID0gUkVTVUxUQlVGCisgICBpZiBubyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIHdhcyBuZWNlc3NhcnkpIGFuZCBzZXQgKkxFTkdUSFAgdG8gdGhlCisgICBudW1iZXIgb2YgcmVzdWx0aW5nIGJ5dGVzLCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gIFVwb24gZXJyb3IsIHNldAorICAgZXJybm8gYW5kIHJldHVybiBOVUxMLiAgKi8KK2V4dGVybiB3Y2hhcl90ICogYXNud3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiB3Y2hhcl90ICogdmFzbndwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90ICpsZW5ndGhwLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVkFTTldQUklOVEZfSCAqLwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvVkVSU0lPTgkxOTk4LTA0LTI2IDA5OjIyOjM3LjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL1ZFUlNJT04JMjAwNC0wOS0xMiAxNDo0MDozNC42Nzk2OTg4NDAgLTA0MDAKQEAgLTEgKzEgQEAKLUdOVSBnZXR0ZXh0IGxpYnJhcnkgZnJvbSBnZXR0ZXh0LTAuMTAuMzIKK0dOVSBnZXR0ZXh0IGxpYnJhcnkgZnJvbSBnZXR0ZXh0LTAuMTQuMQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL2ludGwvd3ByaW50Zi1wYXJzZS5oCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvd3ByaW50Zi1wYXJzZS5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNjk1Njk2NDA4IC0wNDAwCkBAIC0wLDAgKzEsNzUgQEAKKy8qIFBhcnNlIHByaW50ZiBmb3JtYXQgc3RyaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9XUFJJTlRGX1BBUlNFX0gKKyNkZWZpbmUgX1dQUklOVEZfUEFSU0VfSAorCisjaW5jbHVkZSAicHJpbnRmLWFyZ3MuaCIKKworCisvKiBGbGFncyAqLworI2RlZmluZSBGTEFHX0dST1VQCSAxCS8qICcgZmxhZyAqLworI2RlZmluZSBGTEFHX0xFRlQJIDIJLyogLSBmbGFnICovCisjZGVmaW5lIEZMQUdfU0hPV1NJR04JIDQJLyogKyBmbGFnICovCisjZGVmaW5lIEZMQUdfU1BBQ0UJIDgJLyogc3BhY2UgZmxhZyAqLworI2RlZmluZSBGTEFHX0FMVAkxNgkvKiAjIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19aRVJPCTMyCisKKy8qIGFyZ19pbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnQgaXMgY29uc3VtZWQuICAqLworI2RlZmluZSBBUkdfTk9ORQkofihzaXplX3QpMCkKKworLyogQSBwYXJzZWQgZGlyZWN0aXZlLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IHdjaGFyX3QqIGRpcl9zdGFydDsKKyAgY29uc3Qgd2NoYXJfdCogZGlyX2VuZDsKKyAgaW50IGZsYWdzOworICBjb25zdCB3Y2hhcl90KiB3aWR0aF9zdGFydDsKKyAgY29uc3Qgd2NoYXJfdCogd2lkdGhfZW5kOworICBzaXplX3Qgd2lkdGhfYXJnX2luZGV4OworICBjb25zdCB3Y2hhcl90KiBwcmVjaXNpb25fc3RhcnQ7CisgIGNvbnN0IHdjaGFyX3QqIHByZWNpc2lvbl9lbmQ7CisgIHNpemVfdCBwcmVjaXNpb25fYXJnX2luZGV4OworICB3Y2hhcl90IGNvbnZlcnNpb247IC8qIGQgaSBvIHUgeCBYIGYgZSBFIGcgRyBjIHMgcCBuIFUgJSBidXQgbm90IEMgUyAqLworICBzaXplX3QgYXJnX2luZGV4OworfQord2NoYXJfdF9kaXJlY3RpdmU7CisKKy8qIEEgcGFyc2VkIGZvcm1hdCBzdHJpbmcuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGNvdW50OworICB3Y2hhcl90X2RpcmVjdGl2ZSAqZGlyOworICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aDsKKyAgc2l6ZV90IG1heF9wcmVjaXNpb25fbGVuZ3RoOworfQord2NoYXJfdF9kaXJlY3RpdmVzOworCisKKy8qIFBhcnNlcyB0aGUgZm9ybWF0IHN0cmluZy4gIEZpbGxzIGluIHRoZSBudW1iZXIgTiBvZiBkaXJlY3RpdmVzLCBhbmQgZmlsbHMKKyAgIGluIGRpcmVjdGl2ZXNbMF0sIC4uLiwgZGlyZWN0aXZlc1tOLTFdLCBhbmQgc2V0cyBkaXJlY3RpdmVzW05dLmRpcl9zdGFydAorICAgdG8gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZy4gIEFsc28gZmlsbHMgaW4gdGhlIGFyZ190eXBlIGZpZWxkcyBvZiB0aGUKKyAgIGFyZ3VtZW50cyBhbmQgdGhlIG5lZWRlZCBjb3VudCBvZiBhcmd1bWVudHMuICAqLworI2lmZGVmIFNUQVRJQworU1RBVElDCisjZWxzZQorZXh0ZXJuCisjZW5kaWYKK2ludCB3cHJpbnRmX3BhcnNlIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHdjaGFyX3RfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKKworI2VuZGlmIC8qIF9XUFJJTlRGX1BBUlNFX0ggKi8KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3hvcGVuLW1zZy5zZWQJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC94b3Blbi1tc2cuc2VkCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCkBAIC0xLDEwNCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIFgvT3BlbiBzdHlsZSAubXNnIGZpbGUKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jCi0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgaW4gdGhlIC5tc2cgc2hvdWxkIGJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotIyBtZXNzYWdlIHNldCBudW1iZXIuICBXZSB1c2UgYWx3YXlzIHNldCBudW1iZXIgMS4KLSMKLTEgewotICBpXAotJHNldCAxICMgQXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHBvMm1zZy5zZWQKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV2UgY29weSBhbGwgY29tbWVudHMgaW50byB0aGUgLm1zZyBmaWxlLiAgUGVyaGFwcyB0aGV5IGNhbiBoZWxwLgotIwotL14jLyBzL14jWyAJXSovJCAvcAotIwotIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCi0jCi0vXm1zZ2lkLyB7Ci0jIERvZXMgbm90IHdvcmsgbm93Ci0jICAvIiQvISB7Ci0jICAgIHMvXFwkLy8KLSMgICAgcy8kLyAuLi4gKG1vcmUgbGluZXMgZm9sbG93aW5nKSIvCi0jICB9Ci0gIHMvXm1zZ2lkWyAJXSoiXCguKlwpIiQvJCBPcmlnaW5hbCBNZXNzYWdlOiBcMS8KLSAgcAotfQotIwotIyBUaGUgLm1zZyBmaWxlIGNvbnRhaW5zLCBvdGhlciB0aGVuIHRoZSAucG8gZmlsZSwgb25seSB0aGUgdHJhbnNsYXRpb25zCi0jIGJ1dCBlYWNoIGdpdmVuIGEgdW5pcXVlIElELiAgU3RhcnRpbmcgZnJvbSAxIGFuZCBpbmNyZW1lbnRpbmcgYnkgMSBmb3IKLSMgZWFjaCBtZXNzYWdlIHdlIGFzc2lnbiB0aGVtIHRvIHRoZSBtZXNzYWdlcy4KLSMgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIC5wbyBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNhdC1pZC10YmwuYyBmaWxlCi0jICh3aXRoIHBvLXRvLXRibCkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGhlcmUuICAoQXQgbGVhc3QgdGhlIG9yZGVyCi0jIG9mIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBiZSBjaGFuZ2VkLikKLSMKLS9ebXNnc3RyLyB7Ci0gIHMvbXNnc3RyWyAJXSoiXCguKlwpIi9cMS8KLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSMgQnJpbmcgdGhlIGxpbmUgaW4gdGhlIGZvcm1hdCBgPG51bWJlcj4gPG1lc3NhZ2U+JwotICBHCi0gIHMvXlteXG5dKiQvJiAvCi0gIHMvXCguKlwpXG5cKFswLTldKlwpL1wyIFwxLwotIyBDbGVhciBmbGFnIGZyb20gbGFzdCBzdWJzdGl0dXRpb24uCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lLgotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBhIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcblwpIlwoLipcKSIvXDFcMi8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSAgUAotICBECi0jIE5vdGUgdGhhdCBgRCcgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgdGhlIHNlZCBjb21tYW5kIGBEJyBoZXJlCi0gIHMvLipcblwoLipcKS9cMS8KLSAgdGIKLX0KLWQKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9pbnRsL3hzaXplLmgJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC94c2l6ZS5oCTIwMDQtMDktMTIgMTQ6NDA6MzQuNzAwNjk1NjQ4IC0wNDAwCkBAIC0wLDAgKzEsMTA5IEBACisvKiB4c2l6ZS5oIC0tIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4KKworICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfWFNJWkVfSAorI2RlZmluZSBfWFNJWkVfSAorCisvKiBHZXQgc2l6ZV90LiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IFNJWkVfTUFYLiAgKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qIFRoZSBzaXplIG9mIG1lbW9yeSBvYmplY3RzIGlzIG9mdGVuIGNvbXB1dGVkIHRocm91Z2ggZXhwcmVzc2lvbnMgb2YKKyAgIHR5cGUgc2l6ZV90LiBFeGFtcGxlOgorICAgICAgdm9pZCogcCA9IG1hbGxvYyAoaGVhZGVyX3NpemUgKyBuICogZWxlbWVudF9zaXplKS4KKyAgIFRoZXNlIGNvbXB1dGF0aW9ucyBjYW4gbGVhZCB0byBvdmVyZmxvdy4gIFdoZW4gdGhpcyBoYXBwZW5zLCBtYWxsb2MoKQorICAgcmV0dXJucyBhIHBpZWNlIG9mIG1lbW9yeSB0aGF0IGlzIHdheSB0b28gc21hbGwsIGFuZCB0aGUgcHJvZ3JhbSB0aGVuCisgICBjcmFzaGVzIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCB0aGUgbWVtb3J5LgorICAgVG8gYXZvaWQgdGhpcywgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGluIHRoaXMgZmlsZSBjaGVjayBmb3Igb3ZlcmZsb3cuCisgICBUaGUgY29udmVudGlvbiBpcyB0aGF0IFNJWkVfTUFYIHJlcHJlc2VudHMgb3ZlcmZsb3cuCisgICBtYWxsb2MgKFNJWkVfTUFYKSBpcyBub3QgZ3VhcmFudGVlZCB0byBmYWlsIC0tIHRoaW5rIG9mIGEgbWFsbG9jCisgICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbW1hcCAtLSwgaXQncyByZWNvbW1lbmRlZCB0byB1c2Ugc2l6ZV9vdmVyZmxvd19wKCkKKyAgIG9yIHNpemVfaW5fYm91bmRzX3AoKSBiZWZvcmUgaW52b2tpbmcgbWFsbG9jKCkuCisgICBUaGUgZXhhbXBsZSB0aHVzIGJlY29tZXM6CisgICAgICBzaXplX3Qgc2l6ZSA9IHhzdW0gKGhlYWRlcl9zaXplLCB4dGltZXMgKG4sIGVsZW1lbnRfc2l6ZSkpOworICAgICAgdm9pZCAqcCA9IChzaXplX2luX2JvdW5kc19wIChzaXplKSA/IG1hbGxvYyAoc2l6ZSkgOiBOVUxMKTsKKyovCisKKy8qIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHZhbHVlID49IDAgdG8gdHlwZSBzaXplX3QuICAqLworI2RlZmluZSB4Y2FzdF9zaXplX3QoTikgXAorICAoKE4pIDw9IFNJWkVfTUFYID8gKHNpemVfdCkgKE4pIDogU0laRV9NQVgpCisKKy8qIFN1bSBvZiB0d28gc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLworc3RhdGljIGlubGluZSBzaXplX3QKKyNpZiBfX0dOVUNfXyA+PSAzCitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCit4c3VtIChzaXplX3Qgc2l6ZTEsIHNpemVfdCBzaXplMikKK3sKKyAgc2l6ZV90IHN1bSA9IHNpemUxICsgc2l6ZTI7CisgIHJldHVybiAoc3VtID49IHNpemUxID8gc3VtIDogU0laRV9NQVgpOworfQorCisvKiBTdW0gb2YgdGhyZWUgc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLworc3RhdGljIGlubGluZSBzaXplX3QKKyNpZiBfX0dOVUNfXyA+PSAzCitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCit4c3VtMyAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIsIHNpemVfdCBzaXplMykKK3sKKyAgcmV0dXJuIHhzdW0gKHhzdW0gKHNpemUxLCBzaXplMiksIHNpemUzKTsKK30KKworLyogU3VtIG9mIGZvdXIgc2l6ZXMsIHdpdGggb3ZlcmZsb3cgY2hlY2suICAqLworc3RhdGljIGlubGluZSBzaXplX3QKKyNpZiBfX0dOVUNfXyA+PSAzCitfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCit4c3VtNCAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIsIHNpemVfdCBzaXplMywgc2l6ZV90IHNpemU0KQoreworICByZXR1cm4geHN1bSAoeHN1bSAoeHN1bSAoc2l6ZTEsIHNpemUyKSwgc2l6ZTMpLCBzaXplNCk7Cit9CisKKy8qIE1heGltdW0gb2YgdHdvIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CisjaWYgX19HTlVDX18gPj0gMworX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbmRpZgoreG1heCAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpCit7CisgIC8qIE5vIGV4cGxpY2l0IGNoZWNrIGlzIG5lZWRlZCBoZXJlLCBiZWNhdXNlIGZvciBhbnkgbjoKKyAgICAgbWF4IChTSVpFX01BWCwgbikgPT0gU0laRV9NQVggYW5kIG1heCAobiwgU0laRV9NQVgpID09IFNJWkVfTUFYLiAgKi8KKyAgcmV0dXJuIChzaXplMSA+PSBzaXplMiA/IHNpemUxIDogc2l6ZTIpOworfQorCisvKiBNdWx0aXBsaWNhdGlvbiBvZiBhIGNvdW50IHdpdGggYW4gZWxlbWVudCBzaXplLCB3aXRoIG92ZXJmbG93IGNoZWNrLgorICAgVGhlIGNvdW50IG11c3QgYmUgPj0gMCBhbmQgdGhlIGVsZW1lbnQgc2l6ZSBtdXN0IGJlID4gMC4KKyAgIFRoaXMgaXMgYSBtYWNybywgbm90IGFuIGlubGluZSBmdW5jdGlvbiwgc28gdGhhdCBpdCB3b3JrcyBjb3JyZWN0bHkgZXZlbgorICAgd2hlbiBOIGlzIG9mIGEgd2lkZXIgdHVwZSBhbmQgTiA+IFNJWkVfTUFYLiAgKi8KKyNkZWZpbmUgeHRpbWVzKE4sIEVMU0laRSkgXAorICAoKE4pIDw9IFNJWkVfTUFYIC8gKEVMU0laRSkgPyAoc2l6ZV90KSAoTikgKiAoRUxTSVpFKSA6IFNJWkVfTUFYKQorCisvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICAqLworI2RlZmluZSBzaXplX292ZXJmbG93X3AoU0laRSkgXAorICAoKFNJWkUpID09IFNJWkVfTUFYKQorLyogQ2hlY2sgYWdhaW5zdCBvdmVyZmxvdy4gICovCisjZGVmaW5lIHNpemVfaW5fYm91bmRzX3AoU0laRSkgXAorICAoKFNJWkUpICE9IFNJWkVfTUFYKQorCisjZW5kaWYgLyogX1hTSVpFX0ggKi8KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9DaGFuZ2VMb2cJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvQ2hhbmdlTG9nCTIwMDQtMDktMTIgMTQ6NDA6MzUuMDU0NjQxODQwIC0wNDAwCkBAIC0wLDAgKzEsMzIgQEAKKzIwMDQtMDktMTIgIGdldHRleHRpemUgIDxidWctZ251LWdldHRleHRAZ251Lm9yZz4KKworCSogY29kZXNldC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBnZXR0ZXh0Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIGdsaWJjMjEubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogaWNvbnYubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogaW50ZGl2MC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBpbnRtYXgubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogaW50dHlwZXMubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogaW50dHlwZXNfaC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBpbnR0eXBlcy1wcmkubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogaXNjLXBvc2l4Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIGxjbWVzc2FnZS5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBsaWItbGQubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogbGliLWxpbmsubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogbGliLXByZWZpeC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBsb25nZG91YmxlLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIGxvbmdsb25nLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIG5scy5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBwby5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBwcmludGYtcG9zaXgubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogcHJvZ3Rlc3QubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogc2lnbmVkLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIHNpemVfbWF4Lm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIHN0ZGludF9oLm00OiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIHVpbnRtYXhfdC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiB1bG9uZ2xvbmcubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogd2NoYXJfdC5tNDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiB3aW50X3QubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogeHNpemUubTQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLgorCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvY29kZXNldC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC9jb2Rlc2V0Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODIwNjc3NDA4IC0wNDAwCkBAIC0wLDAgKzEsMjMgQEAKKyMgY29kZXNldC5tNCBzZXJpYWwgQU0xIChnZXR0ZXh0LTAuMTAuNDApCitkbmwgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW0FNX0xBTkdJTkZPX0NPREVTRVRdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIG5sX2xhbmdpbmZvIGFuZCBDT0RFU0VUXSwgYW1fY3ZfbGFuZ2luZm9fY29kZXNldCwKKyAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsYW5naW5mby5oPl0sCisgICAgICBbY2hhciogY3MgPSBubF9sYW5naW5mbyhDT0RFU0VUKTtdLAorICAgICAgYW1fY3ZfbGFuZ2luZm9fY29kZXNldD15ZXMsCisgICAgICBhbV9jdl9sYW5naW5mb19jb2Rlc2V0PW5vKQorICAgIF0pCisgIGlmIHRlc3QgJGFtX2N2X2xhbmdpbmZvX2NvZGVzZXQgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9MQU5HSU5GT19DT0RFU0VULCAxLAorICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSA8bGFuZ2luZm8uaD4gYW5kIG5sX2xhbmdpbmZvKENPREVTRVQpLl0pCisgIGZpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2dldHRleHQubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvZ2V0dGV4dC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0LjgyNjY3NjQ5NiAtMDQwMApAQCAtMCwwICsxLDQ4NyBAQAorIyBnZXR0ZXh0Lm00IHNlcmlhbCAyOCAoZ2V0dGV4dC0wLjEzKQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUtMjAwMC4KK2RubCAgIEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPiwgMjAwMC0yMDAzLgorCitkbmwgTWFjcm8gdG8gYWRkIGZvciB1c2luZyBHTlUgZ2V0dGV4dC4KKworZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVChbSU5UTFNZTUJPTF0sIFtORUVEU1lNQk9MXSwgW0lOVExESVJdKS4KK2RubCBJTlRMU1lNQk9MIGNhbiBiZSBvbmUgb2YgJ2V4dGVybmFsJywgJ25vLWxpYnRvb2wnLCAndXNlLWxpYnRvb2wnLiBUaGUKK2RubCAgICBkZWZhdWx0IChpZiBpdCBpcyBub3Qgc3BlY2lmaWVkIG9yIGVtcHR5KSBpcyAnbm8tbGlidG9vbCcuCitkbmwgICAgSU5UTFNZTUJPTCBzaG91bGQgYmUgJ2V4dGVybmFsJyBmb3IgcGFja2FnZXMgd2l0aCBubyBpbnRsIGRpcmVjdG9yeSwKK2RubCAgICBhbmQgJ25vLWxpYnRvb2wnIG9yICd1c2UtbGlidG9vbCcgZm9yIHBhY2thZ2VzIHdpdGggYW4gaW50bCBkaXJlY3RvcnkuCitkbmwgICAgSWYgSU5UTFNZTUJPTCBpcyAndXNlLWxpYnRvb2wnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5CitkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5sYSB3aWxsIGJlIGNyZWF0ZWQgKHNoYXJlZCBhbmQvb3Igc3RhdGljLAorZG5sICAgIGRlcGVuZGluZyBvbiAtLXtlbmFibGUsZGlzYWJsZX0te3NoYXJlZCxzdGF0aWN9IGFuZCBvbiB0aGUgcHJlc2VuY2Ugb2YKK2RubCAgICBBTS1ESVNBQkxFLVNIQVJFRCkuIElmIElOVExTWU1CT0wgaXMgJ25vLWxpYnRvb2wnLCBhIHN0YXRpYyBsaWJyYXJ5CitkbmwgICAgJCh0b3BfYnVpbGRkaXIpL2ludGwvbGliaW50bC5hIHdpbGwgYmUgY3JlYXRlZC4KK2RubCBJZiBORUVEU1lNQk9MIGlzIHNwZWNpZmllZCBhbmQgaXMgJ25lZWQtbmdldHRleHQnLCB0aGVuIEdOVSBnZXR0ZXh0CitkbmwgICAgaW1wbGVtZW50YXRpb25zIChpbiBsaWJjIG9yIGxpYmludGwpIHdpdGhvdXQgdGhlIG5nZXR0ZXh0KCkgZnVuY3Rpb24KK2RubCAgICB3aWxsIGJlIGlnbm9yZWQuICBJZiBORUVEU1lNQk9MIGlzIHNwZWNpZmllZCBhbmQgaXMKK2RubCAgICAnbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zJywgdGhlbiBHTlUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkb24ndAorZG5sICAgIHN1cHBvcnQgdGhlIElTTyBDIDk5IDxpbnR0eXBlcy5oPiBmb3JtYXRzdHJpbmcgbWFjcm9zIHdpbGwgYmUgaWdub3JlZC4KK2RubCBJTlRMRElSIGlzIHVzZWQgdG8gZmluZCB0aGUgaW50bCBsaWJyYXJpZXMuICBJZiBlbXB0eSwKK2RubCAgICB0aGUgdmFsdWUgYCQodG9wX2J1aWxkZGlyKS9pbnRsLycgaXMgdXNlZC4KK2RubAorZG5sIFRoZSByZXN1bHQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgb25lIG9mIHRocmVlIGNhc2VzOgorZG5sIDEpIEdOVSBnZXR0ZXh0LCBhcyBpbmNsdWRlZCBpbiB0aGUgaW50bCBzdWJkaXJlY3RvcnksIHdpbGwgYmUgY29tcGlsZWQKK2RubCAgICBhbmQgdXNlZC4KK2RubCAgICBDYXRhbG9nIGZvcm1hdDogR05VIC0tPiBpbnN0YWxsIGluICQoZGF0YWRpcikKK2RubCAgICBDYXRhbG9nIGV4dGVuc2lvbjogLm1vIGFmdGVyIGluc3RhbGxhdGlvbiwgLmdtbyBpbiBzb3VyY2UgdHJlZQorZG5sIDIpIEdOVSBnZXR0ZXh0IGhhcyBiZWVuIGZvdW5kIGluIHRoZSBzeXN0ZW0ncyBDIGxpYnJhcnkuCitkbmwgICAgQ2F0YWxvZyBmb3JtYXQ6IEdOVSAtLT4gaW5zdGFsbCBpbiAkKGRhdGFkaXIpCitkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IC5tbyBhZnRlciBpbnN0YWxsYXRpb24sIC5nbW8gaW4gc291cmNlIHRyZWUKK2RubCAzKSBObyBpbnRlcm5hdGlvbmFsaXphdGlvbiwgYWx3YXlzIHVzZSBFbmdsaXNoIG1zZ2lkLgorZG5sICAgIENhdGFsb2cgZm9ybWF0OiBub25lCitkbmwgICAgQ2F0YWxvZyBleHRlbnNpb246IG5vbmUKK2RubCBJZiBJTlRMU1lNQk9MIGlzICdleHRlcm5hbCcsIG9ubHkgY2FzZXMgMiBhbmQgMyBjYW4gb2NjdXIuCitkbmwgVGhlIHVzZSBvZiAuZ21vIGlzIGhpc3RvcmljYWwgKGl0IHdhcyBuZWVkZWQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdGhlCitkbmwgR05VIGZvcm1hdCBjYXRhbG9ncyB3aGVuIGJ1aWxkaW5nIG9uIGEgcGxhdGZvcm0gd2l0aCBhbiBYL09wZW4gZ2V0dGV4dCksCitkbmwgYnV0IHdlIGtlZXAgaXQgaW4gb3JkZXIgbm90IHRvIGZvcmNlIGlycmVsZXZhbnQgZmlsZW5hbWUgY2hhbmdlcyBvbiB0aGUKK2RubCBtYWludGFpbmVycy4KK2RubAorQUNfREVGVU4oW0FNX0dOVV9HRVRURVhUXSwKK1sKKyAgZG5sIEFyZ3VtZW50IGNoZWNraW5nLgorICBpZmVsc2UoWyQxXSwgW10sICwgW2lmZWxzZShbJDFdLCBbZXh0ZXJuYWxdLCAsIFtpZmVsc2UoWyQxXSwgW25vLWxpYnRvb2xdLCAsIFtpZmVsc2UoWyQxXSwgW3VzZS1saWJ0b29sXSwgLAorICAgIFtlcnJwcmludChbRVJST1I6IGludmFsaWQgZmlyc3QgYXJndW1lbnQgdG8gQU1fR05VX0dFVFRFWFQKK10pXSldKV0pXSkKKyAgaWZlbHNlKFskMl0sIFtdLCAsIFtpZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCAsIFtpZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sICwKKyAgICBbZXJycHJpbnQoW0VSUk9SOiBpbnZhbGlkIHNlY29uZCBhcmd1bWVudCB0byBBTV9HTlVfR0VUVEVYVAorXSldKV0pXSkKKyAgZGVmaW5lKGd0X2luY2x1ZGVkX2ludGwsIGlmZWxzZShbJDFdLCBbZXh0ZXJuYWxdLCBbbm9dLCBbeWVzXSkpCisgIGRlZmluZShndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXgsIGlmZWxzZShbJDFdLCBbdXNlLWxpYnRvb2xdLCBbbF0sIFtdKSkKKworICBBQ19SRVFVSVJFKFtBTV9QT19TVUJESVJTXSlkbmwKKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgIEFDX1JFUVVJUkUoW0FNX0lOVExfU1VCRElSXSlkbmwKKyAgXSkKKworICBkbmwgUHJlcmVxdWlzaXRlcyBvZiBBQ19MSUJfTElOS0ZMQUdTX0JPRFkuCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisKKyAgZG5sIFNvbWV0aW1lcyBsaWJpbnRsIHJlcXVpcmVzIGxpYmljb252LCBzbyBmaXJzdCBzZWFyY2ggZm9yIGxpYmljb252LgorICBkbmwgSWRlYWxseSB3ZSB3b3VsZCBkbyB0aGlzIHNlYXJjaCBvbmx5IGFmdGVyIHRoZQorICBkbmwgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICBkbmwgICAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KKyAgZG5sIHRlc3RzLiBCdXQgaWYgY29uZmlndXJlLmluIGludm9rZXMgQU1fSUNPTlYgYWZ0ZXIgQU1fR05VX0dFVFRFWFQKKyAgZG5sIHRoZSBjb25maWd1cmUgc2NyaXB0IHdvdWxkIG5lZWQgdG8gY29udGFpbiB0aGUgc2FtZSBzaGVsbCBjb2RlCisgIGRubCBhZ2Fpbiwgb3V0c2lkZSBhbnkgJ2lmJy4gVGhlcmUgYXJlIHR3byBzb2x1dGlvbnM6CisgIGRubCAtIEludm9rZSBBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWSBoZXJlLCBvdXRzaWRlIGFueSAnaWYnLgorICBkbmwgLSBDb250cm9sIHRoZSBleHBhbnNpb25zIGluIG1vcmUgZGV0YWlsIHVzaW5nIEFDX1BST1ZJREVfSUZFTFNFLgorICBkbmwgU2luY2UgQUNfUFJPVklERV9JRkVMU0UgaXMgb25seSBpbiBhdXRvY29uZiA+PSAyLjUyIGFuZCBub3QKKyAgZG5sIGRvY3VtZW50ZWQsIHdlIGF2b2lkIGl0LgorICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCAsIFsKKyAgICBBQ19SRVFVSVJFKFtBTV9JQ09OVl9MSU5LRkxBR1NfQk9EWV0pCisgIF0pCisKKyAgZG5sIFNldCBVU0VfTkxTLgorICBBTV9OTFMKKworICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCBbCisgICAgQlVJTERfSU5DTFVERURfTElCSU5UTD1ubworICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCisgIF0pCisgIExJQklOVEw9CisgIExUTElCSU5UTD0KKyAgUE9TVUI9CisKKyAgZG5sIElmIHdlIHVzZSBOTFMgZmlndXJlIG91dCB3aGF0IG1ldGhvZAorICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgorICAgIGd0X3VzZV9wcmVpbnN0YWxsZWRfZ251Z2V0dGV4dD1ubworICAgIGlmZWxzZShndF9pbmNsdWRlZF9pbnRsLCB5ZXMsIFsKKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCisgICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAorICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCisgICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCisgICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQorCisgICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgIF0pCisgICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKKyAgICAgICAgZG5sIHRvIHVzZS4gIElmIEdOVSBnZXR0ZXh0IGlzIGF2YWlsYWJsZSB3ZSB1c2UgdGhpcy4gIEVsc2Ugd2UgaGF2ZQorICAgICAgICBkbmwgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KKworICAgICAgICBkbmwgQWRkIGEgdmVyc2lvbiBudW1iZXIgdG8gdGhlIGNhY2hlIG1hY3Jvcy4KKyAgICAgICAgZGVmaW5lKFtndF9hcGlfdmVyc2lvbl0sIGlmZWxzZShbJDJdLCBbbmVlZC1mb3JtYXRzdHJpbmctbWFjcm9zXSwgMywgaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgMiwgMSkpKQorICAgICAgICBkZWZpbmUoW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjXSwgW2d0X2N2X2Z1bmNfZ251Z2V0dGV4dF1ndF9hcGlfdmVyc2lvbltfbGliY10pCisgICAgICAgIGRlZmluZShbZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGxdLCBbZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0XWd0X2FwaV92ZXJzaW9uW19saWJpbnRsXSkKKworICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dudWdldHRleHRfbGliYywKKyAgICAgICAgIFtBQ19UUllfTElOSyhbI2luY2x1ZGUgPGxpYmludGwuaD4KK11pZmVsc2UoWyQyXSwgW25lZWQtZm9ybWF0c3RyaW5nLW1hY3Jvc10sCitbI2lmbmRlZiBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTgorI2RlZmluZSBfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTihtYWpvcikgKChtYWpvcikgPT0gMCA/IDAgOiAtMSkKKyNlbmRpZgorY2hhbmdlcXVvdGUoLClkbmwKK3R5cGVkZWYgaW50IGFycmF5IFsyICogKF9fR05VX0dFVFRFWFRfU1VQUE9SVEVEX1JFVklTSU9OKDApID49IDEpIC0gMV07CitjaGFuZ2VxdW90ZShbLF0pZG5sCitdLCBbXSlbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOworZXh0ZXJuIGludCAqX25sX2RvbWFpbl9iaW5kaW5ncztdLAorICAgICAgICAgICAgW2JpbmR0ZXh0ZG9tYWluICgiIiwgIiIpOworcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKV1pZmVsc2UoWyQyXSwgW25lZWQtbmdldHRleHRdLCBbICsgKGludCkgbmdldHRleHQgKCIiLCAiIiwgMCldLCBbXSlbICsgX25sX21zZ19jYXRfY250ciArICpfbmxfZG9tYWluX2JpbmRpbmdzXSwKKyAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjPXllcywKKyAgICAgICAgICAgIGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjPW5vKV0pCisKKyAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgIGRubCBTb21ldGltZXMgbGliaW50bCByZXF1aXJlcyBsaWJpY29udiwgc28gZmlyc3Qgc2VhcmNoIGZvciBsaWJpY29udi4KKyAgICAgICAgICBpZmVsc2UoZ3RfaW5jbHVkZWRfaW50bCwgeWVzLCAsIFsKKyAgICAgICAgICAgIEFNX0lDT05WX0xJTksKKyAgICAgICAgICBdKQorICAgICAgICAgIGRubCBTZWFyY2ggZm9yIGxpYmludGwgYW5kIGRlZmluZSBMSUJJTlRMLCBMVExJQklOVEwgYW5kIElOQ0lOVEwKKyAgICAgICAgICBkbmwgYWNjb3JkaW5nbHkuIERvbid0IHVzZSBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoW2ludGxdLFtpY29udl0pCisgICAgICAgICAgZG5sIGJlY2F1c2UgdGhhdCB3b3VsZCBhZGQgIi1saWNvbnYiIHRvIExJQklOVEwgYW5kIExUTElCSU5UTAorICAgICAgICAgIGRubCBldmVuIGlmIGxpYmljb252IGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAgQUNfTElCX0xJTktGTEFHU19CT0RZKFtpbnRsXSkKKyAgICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIEdOVSBnZXR0ZXh0IGluIGxpYmludGxdLAorICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwsCisgICAgICAgICAgIFtndF9zYXZlX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCisgICAgICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRJTkNJTlRMIgorICAgICAgICAgICAgZ3Rfc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgICAgIExJQlM9IiRMSUJTICRMSUJJTlRMIgorICAgICAgICAgICAgZG5sIE5vdyBzZWUgd2hldGhlciBsaWJpbnRsIGV4aXN0cyBhbmQgZG9lcyBub3QgZGVwZW5kIG9uIGxpYmljb252LgorICAgICAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CitdaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLAorWyNpZm5kZWYgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisjZW5kaWYKK2NoYW5nZXF1b3RlKCwpZG5sCit0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworY2hhbmdlcXVvdGUoWyxdKWRubAorXSwgW10pW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKK2V4dGVybgorI2lmZGVmIF9fY3BsdXNwbHVzCisiQyIKKyNlbmRpZgorY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoKTtdLAorICAgICAgICAgICAgICBbYmluZHRleHRkb21haW4gKCIiLCAiIik7CityZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXWlmZWxzZShbJDJdLCBbbmVlZC1uZ2V0dGV4dF0sIFsgKyAoaW50KSBuZ2V0dGV4dCAoIiIsICIiLCAwKV0sIFtdKVsgKyBfbmxfbXNnX2NhdF9jbnRyICsgKl9ubF9leHBhbmRfYWxpYXMgKDApXSwKKyAgICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGw9eWVzLAorICAgICAgICAgICAgICBndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bD1ubykKKyAgICAgICAgICAgIGRubCBOb3cgc2VlIHdoZXRoZXIgbGliaW50bCBleGlzdHMgYW5kIGRlcGVuZHMgb24gbGliaWNvbnYuCisgICAgICAgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiICE9IHllcyAmJiB0ZXN0IC1uICIkTElCSUNPTlYiOyB0aGVuCisgICAgICAgICAgICAgIExJQlM9IiRMSUJTICRMSUJJQ09OViIKKyAgICAgICAgICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+CitdaWZlbHNlKFskMl0sIFtuZWVkLWZvcm1hdHN0cmluZy1tYWNyb3NdLAorWyNpZm5kZWYgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpICgobWFqb3IpID09IDAgPyAwIDogLTEpCisjZW5kaWYKK2NoYW5nZXF1b3RlKCwpZG5sCit0eXBlZGVmIGludCBhcnJheSBbMiAqIChfX0dOVV9HRVRURVhUX1NVUFBPUlRFRF9SRVZJU0lPTigwKSA+PSAxKSAtIDFdOworY2hhbmdlcXVvdGUoWyxdKWRubAorXSwgW10pW2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKK2V4dGVybgorI2lmZGVmIF9fY3BsdXNwbHVzCisiQyIKKyNlbmRpZgorY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoKTtdLAorICAgICAgICAgICAgICAgIFtiaW5kdGV4dGRvbWFpbiAoIiIsICIiKTsKK3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildaWZlbHNlKFskMl0sIFtuZWVkLW5nZXR0ZXh0XSwgWyArIChpbnQpIG5nZXR0ZXh0ICgiIiwgIiIsIDApXSwgW10pWyArIF9ubF9tc2dfY2F0X2NudHIgKyAqX25sX2V4cGFuZF9hbGlhcyAoMCldLAorICAgICAgICAgICAgICAgW0xJQklOVEw9IiRMSUJJTlRMICRMSUJJQ09OViIKKyAgICAgICAgICAgICAgICBMVExJQklOVEw9IiRMVExJQklOVEwgJExUTElCSUNPTlYiCisgICAgICAgICAgICAgICAgZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGw9eWVzCisgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIENQUEZMQUdTPSIkZ3Rfc2F2ZV9DUFBGTEFHUyIKKyAgICAgICAgICAgIExJQlM9IiRndF9zYXZlX0xJQlMiXSkKKyAgICAgICAgZmkKKworICAgICAgICBkbmwgSWYgYW4gYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZCBHTlUgZ2V0dGV4dCgpIGlzIGZvdW5kLAorICAgICAgICBkbmwgdXNlIGl0LiAgQnV0IGlmIHRoaXMgbWFjcm8gaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCwgYW5kIEdOVQorICAgICAgICBkbmwgZ2V0dGV4dCBpcyBhbHJlYWR5IHByZWluc3RhbGxlZCBpbiBsaWJpbnRsLCB3ZSB1cGRhdGUgdGhpcworICAgICAgICBkbmwgbGliaW50bC4gIChDZi4gdGhlIGluc3RhbGwgcnVsZSBpbiBpbnRsL01ha2VmaWxlLmluLikKKyAgICAgICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ251Z2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKKyAgICAgICAgICAgfHwgeyB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiID0gInllcyIgXAorICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXJ1bnRpbWUgXAorICAgICAgICAgICAgICAgICYmIHRlc3QgIiRQQUNLQUdFIiAhPSBnZXR0ZXh0LXRvb2xzOyB9OyB0aGVuCisgICAgICAgICAgZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0PXllcworICAgICAgICBlbHNlCisgICAgICAgICAgZG5sIFJlc2V0IHRoZSB2YWx1ZXMgc2V0IGJ5IHNlYXJjaGluZyBmb3IgbGliaW50bC4KKyAgICAgICAgICBMSUJJTlRMPQorICAgICAgICAgIExUTElCSU5UTD0KKyAgICAgICAgICBJTkNJTlRMPQorICAgICAgICBmaQorCisgICAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgICAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgIGRubCBHTlUgZ2V0dGV4dCBpcyBub3QgZm91bmQgaW4gdGhlIEMgbGlicmFyeS4KKyAgICAgICAgICBkbmwgRmFsbCBiYWNrIG9uIGluY2x1ZGVkIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCisgICAgICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKKyAgICAgICAgZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgIGRubCBNYXJrIGFjdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSBHTlUgTkxTIGxpYnJhcnkuCisgICAgICAgIEJVSUxEX0lOQ0xVREVEX0xJQklOVEw9eWVzCisgICAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcworICAgICAgICBMSUJJTlRMPSJpZmVsc2UoWyQzXSxbXSxcJHt0b3BfYnVpbGRkaXJ9L2ludGwsWyQzXSkvbGliaW50bC5bXWd0X2xpYnRvb2xfc3VmZml4X3ByZWZpeFtdYSAkTElCSUNPTlYiCisgICAgICAgIExUTElCSU5UTD0iaWZlbHNlKFskM10sW10sXCR7dG9wX2J1aWxkZGlyfS9pbnRsLFskM10pL2xpYmludGwuW11ndF9saWJ0b29sX3N1ZmZpeF9wcmVmaXhbXWEgJExUTElCSUNPTlYiCisgICAgICAgIExJQlM9YGVjaG8gIiAkTElCUyAiIHwgc2VkIC1lICdzLyAtbGludGwgLyAvJyAtZSAncy9eIC8vJyAtZSAncy8gJC8vJ2AKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyIgXAorICAgICAgICAgfHwgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgICAgZG5sIE1hcmsgYWN0aW9ucyB0byB1c2UgR05VIGdldHRleHQgdG9vbHMuCisgICAgICAgIENBVE9CSkVYVD0uZ21vCisgICAgICBmaQorICAgIF0pCisKKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiIFwKKyAgICAgICB8fCB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgorICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsCisgICAgICAgIFtEZWZpbmUgdG8gMSBpZiB0cmFuc2xhdGlvbiBvZiBwcm9ncmFtIG1lc3NhZ2VzIHRvIHRoZSB1c2VyJ3MgbmF0aXZlIGxhbmd1YWdlCisgICBpcyByZXF1ZXN0ZWQuXSkKKyAgICBlbHNlCisgICAgICBVU0VfTkxTPW5vCisgICAgZmkKKyAgZmkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gdXNlIE5MU10pCisgIEFDX01TR19SRVNVTFQoWyRVU0VfTkxTXSkKKyAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXJlIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGNvbWVzIGZyb21dKQorICAgIGlmIHRlc3QgIiRndF91c2VfcHJlaW5zdGFsbGVkX2dudWdldHRleHQiID0gInllcyI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dudWdldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgorICAgICAgICBndF9zb3VyY2U9ImV4dGVybmFsIGxpYmludGwiCisgICAgICBlbHNlCisgICAgICAgIGd0X3NvdXJjZT0ibGliYyIKKyAgICAgIGZpCisgICAgZWxzZQorICAgICAgZ3Rfc291cmNlPSJpbmNsdWRlZCBpbnRsIGRpcmVjdG9yeSIKKyAgICBmaQorICAgIEFDX01TR19SRVNVTFQoWyRndF9zb3VyY2VdKQorICBmaQorCisgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCisKKyAgICBpZiB0ZXN0ICIkZ3RfdXNlX3ByZWluc3RhbGxlZF9nbnVnZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCisgICAgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nbnVnZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gbGluayB3aXRoIGxpYmludGxdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskTElCSU5UTF0pCisgICAgICAgIEFDX0xJQl9BUFBFTkRUT1ZBUihbQ1BQRkxBR1NdLCBbJElOQ0lOVExdKQorICAgICAgZmkKKworICAgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIHBhY2thZ2VzIG1heSBiZSB1c2luZyB0aGlzLgorICAgICAgQUNfREVGSU5FKEhBVkVfR0VUVEVYVCwgMSwKKyAgICAgICBbRGVmaW5lIGlmIHRoZSBHTlUgZ2V0dGV4dCgpIGZ1bmN0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBvciBwcmVpbnN0YWxsZWQuXSkKKyAgICAgIEFDX0RFRklORShIQVZFX0RDR0VUVEVYVCwgMSwKKyAgICAgICBbRGVmaW5lIGlmIHRoZSBHTlUgZGNnZXR0ZXh0KCkgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZC5dKQorICAgIGZpCisKKyAgICBkbmwgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgorICAgIFBPU1VCPXBvCisgIGZpCisKKyAgaWZlbHNlKGd0X2luY2x1ZGVkX2ludGwsIHllcywgWworICAgIGRubCBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgQlVJTERfSU5DTFVERURfTElCSU5UTAorICAgIGRubCB0byAneWVzJyBiZWNhdXNlIHNvbWUgb2YgdGhlIHRlc3RzdWl0ZSByZXF1aXJlcyBpdC4KKyAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0LXJ1bnRpbWUgfHwgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dC10b29sczsgdGhlbgorICAgICAgQlVJTERfSU5DTFVERURfTElCSU5UTD15ZXMKKyAgICBmaQorCisgICAgZG5sIE1ha2UgYWxsIHZhcmlhYmxlcyB3ZSB1c2Uga25vd24gdG8gYXV0b2NvbmYuCisgICAgQUNfU1VCU1QoQlVJTERfSU5DTFVERURfTElCSU5UTCkKKyAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKKyAgICBBQ19TVUJTVChDQVRPQkpFWFQpCisKKyAgICBkbmwgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFNvbWUgY29uZmlndXJlLmlucyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBubHNfY3ZfaGVhZGVyX2ludGw9CisgICAgbmxzX2N2X2hlYWRlcl9saWJndD0KKworICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisgICAgREFUQURJUk5BTUU9c2hhcmUKKyAgICBBQ19TVUJTVChEQVRBRElSTkFNRSkKKworICAgIGRubCBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gU29tZSBNYWtlZmlsZXMgbWF5IGJlIHVzaW5nIHRoaXMuCisgICAgSU5TVE9CSkVYVD0ubW8KKyAgICBBQ19TVUJTVChJTlNUT0JKRVhUKQorCisgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBHRU5DQVQ9Z2VuY2F0CisgICAgQUNfU1VCU1QoR0VOQ0FUKQorCisgICAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgICBpZiB0ZXN0ICIkVVNFX0lOQ0xVREVEX0xJQklOVEwiID0geWVzOyB0aGVuCisgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgorICAgIGZpCisgICAgQUNfU1VCU1QoSU5UTE9CSlMpCisKKyAgICBkbmwgRW5hYmxlIGxpYnRvb2wgc3VwcG9ydCBpZiB0aGUgc3Vycm91bmRpbmcgcGFja2FnZSB3aXNoZXMgaXQuCisgICAgSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVg9Z3RfbGlidG9vbF9zdWZmaXhfcHJlZml4CisgICAgQUNfU1VCU1QoSU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVgpCisgIF0pCisKKyAgZG5sIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBTb21lIE1ha2VmaWxlcyBtYXkgYmUgdXNpbmcgdGhpcy4KKyAgSU5UTExJQlM9IiRMSUJJTlRMIgorICBBQ19TVUJTVChJTlRMTElCUykKKworICBkbmwgTWFrZSBhbGwgZG9jdW1lbnRlZCB2YXJpYWJsZXMga25vd24gdG8gYXV0b2NvbmYuCisgIEFDX1NVQlNUKExJQklOVEwpCisgIEFDX1NVQlNUKExUTElCSU5UTCkKKyAgQUNfU1VCU1QoUE9TVUIpCitdKQorCisKK2RubCBDaGVja3MgZm9yIGFsbCBwcmVyZXF1aXNpdGVzIG9mIHRoZSBpbnRsIHN1YmRpcmVjdG9yeSwKK2RubCBleGNlcHQgZm9yIElOVExfTElCVE9PTF9TVUZGSVhfUFJFRklYIChhbmQgcG9zc2libHkgTElCVE9PTCksIElOVExPQkpTLAorZG5sICAgICAgICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEwsIEJVSUxEX0lOQ0xVREVEX0xJQklOVEwuCitBQ19ERUZVTihbQU1fSU5UTF9TVUJESVJdLAorWworICBBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAorICBBQ19SRVFVSVJFKFtBTV9NS0lOU1RBTExESVJTXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAorICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAorICBBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubAorICBBQ19SRVFVSVJFKFtiaF9DX1NJR05FRF0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NfSU5MSU5FXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfVFlQRV9PRkZfVF0pZG5sCisgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKKyAgQUNfUkVRVUlSRShbam1fQUNfVFlQRV9MT05HX0xPTkddKWRubAorICBBQ19SRVFVSVJFKFtndF9UWVBFX0xPTkdET1VCTEVdKWRubAorICBBQ19SRVFVSVJFKFtndF9UWVBFX1dDSEFSX1RdKWRubAorICBBQ19SRVFVSVJFKFtndF9UWVBFX1dJTlRfVF0pZG5sCisgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9JTlRUWVBFU19IXSkKKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX1NURElOVF9IXSkKKyAgQUNfUkVRVUlSRShbZ3RfVFlQRV9JTlRNQVhfVF0pCisgIEFDX1JFUVVJUkUoW2d0X1BSSU5URl9QT1NJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKKyAgQUNfUkVRVUlSRShbQUNfRlVOQ19NTUFQXSlkbmwKKyAgQUNfUkVRVUlSRShbam1fR0xJQkMyMV0pZG5sCisgIEFDX1JFUVVJUkUoW2d0X0lOVERJVjBdKWRubAorICBBQ19SRVFVSVJFKFtqbV9BQ19UWVBFX1VJTlRNQVhfVF0pZG5sCisgIEFDX1JFUVVJUkUoW2d0X0hFQURFUl9JTlRUWVBFU19IXSlkbmwKKyAgQUNfUkVRVUlSRShbZ3RfSU5UVFlQRVNfUFJJXSlkbmwKKyAgQUNfUkVRVUlSRShbZ2xfWFNJWkVdKWRubAorCisgIEFDX0NIRUNLX1RZUEUoW3B0cmRpZmZfdF0sICwKKyAgICBbQUNfREVGSU5FKFtwdHJkaWZmX3RdLCBbbG9uZ10sCisgICAgICAgW0RlZmluZSBhcyB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHR3byBwb2ludGVycywgaWYgdGhlIHN5c3RlbSBkb2Vzbid0IGRlZmluZSBpdC5dKQorICAgIF0pCisgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0ZGRlZi5oIFwKK3N0ZGxpYi5oIHN0cmluZy5oIHVuaXN0ZC5oIHN5cy9wYXJhbS5oXSkKKyAgQUNfQ0hFQ0tfRlVOQ1MoW2FzcHJpbnRmIGZ3cHJpbnRmIGdldGN3ZCBnZXRlZ2lkIGdldGV1aWQgZ2V0Z2lkIGdldHVpZCBcCittZW1wY3B5IG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzbnByaW50ZiBzdHBjcHkgc3RyY2FzZWNtcCBzdHJkdXAgXAorc3RydG91bCB0c2VhcmNoIHdjc2xlbiBfX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dCBcCitfX2ZzZXRsb2NraW5nXSkKKworICBkbmwgVXNlIHRoZSBfc25wcmludGYgZnVuY3Rpb24gb25seSBpZiBpdCBpcyBkZWNsYXJlZCAoYmVjYXVzZSBvbiBOZXRCU0QgaXQKKyAgZG5sIGlzIGRlZmluZWQgYXMgYSB3ZWFrIGFsaWFzIG9mIHNucHJpbnRmOyB3ZSBwcmVmZXIgdG8gdXNlIHRoZSBsYXR0ZXIpLgorICBndF9DSEVDS19ERUNMKF9zbnByaW50ZiwgWyNpbmNsdWRlIDxzdGRpby5oPl0pCisgIGd0X0NIRUNLX0RFQ0woX3Nud3ByaW50ZiwgWyNpbmNsdWRlIDxzdGRpby5oPl0pCisKKyAgZG5sIFVzZSB0aGUgKl91bmxvY2tlZCBmdW5jdGlvbnMgb25seSBpZiB0aGV5IGFyZSBkZWNsYXJlZC4KKyAgZG5sIChiZWNhdXNlIHNvbWUgb2YgdGhlbSB3ZXJlIGRlZmluZWQgd2l0aG91dCBiZWluZyBkZWNsYXJlZCBpbiBTb2xhcmlzCisgIGRubCAyLjUuMSBidXQgd2VyZSByZW1vdmVkIGluIFNvbGFyaXMgMi42LCB3aGVyZWFzIHdlIHdhbnQgYmluYXJpZXMgYnVpbHQKKyAgZG5sIG9uIFNvbGFyaXMgMi41LjEgdG8gcnVuIG9uIFNvbGFyaXMgMi42KS4KKyAgZG5sIERvbid0IHVzZSBBQ19DSEVDS19ERUNMUyBiZWNhdXNlIGl0IGlzbid0IHN1cHBvcnRlZCBpbiBhdXRvY29uZi0yLjEzLgorICBndF9DSEVDS19ERUNMKGZlb2ZfdW5sb2NrZWQsIFsjaW5jbHVkZSA8c3RkaW8uaD5dKQorICBndF9DSEVDS19ERUNMKGZnZXRzX3VubG9ja2VkLCBbI2luY2x1ZGUgPHN0ZGlvLmg+XSkKKyAgZ3RfQ0hFQ0tfREVDTChnZXRjX3VubG9ja2VkLCBbI2luY2x1ZGUgPHN0ZGlvLmg+XSkKKworICBjYXNlICRndF9jdl9mdW5jX3ByaW50Zl9wb3NpeCBpbgorICAgICp5ZXMpIEhBVkVfUE9TSVhfUFJJTlRGPTEgOzsKKyAgICAqKSBIQVZFX1BPU0lYX1BSSU5URj0wIDs7CisgIGVzYWMKKyAgQUNfU1VCU1QoW0hBVkVfUE9TSVhfUFJJTlRGXSkKKyAgaWYgdGVzdCAiJGFjX2N2X2Z1bmNfYXNwcmludGYiID0geWVzOyB0aGVuCisgICAgSEFWRV9BU1BSSU5URj0xCisgIGVsc2UKKyAgICBIQVZFX0FTUFJJTlRGPTAKKyAgZmkKKyAgQUNfU1VCU1QoW0hBVkVfQVNQUklOVEZdKQorICBpZiB0ZXN0ICIkYWNfY3ZfZnVuY19zbnByaW50ZiIgPSB5ZXM7IHRoZW4KKyAgICBIQVZFX1NOUFJJTlRGPTEKKyAgZWxzZQorICAgIEhBVkVfU05QUklOVEY9MAorICBmaQorICBBQ19TVUJTVChbSEFWRV9TTlBSSU5URl0pCisgIGlmIHRlc3QgIiRhY19jdl9mdW5jX3dwcmludGYiID0geWVzOyB0aGVuCisgICAgSEFWRV9XUFJJTlRGPTEKKyAgZWxzZQorICAgIEhBVkVfV1BSSU5URj0wCisgIGZpCisgIEFDX1NVQlNUKFtIQVZFX1dQUklOVEZdKQorCisgIEFNX0lDT05WCisgIEFNX0xBTkdJTkZPX0NPREVTRVQKKyAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCisgICAgQU1fTENfTUVTU0FHRVMKKyAgZmkKKworICBkbmwgaW50bC9wbHVyYWwuYyBpcyBnZW5lcmF0ZWQgZnJvbSBpbnRsL3BsdXJhbC55LiBJdCByZXF1aXJlcyBiaXNvbiwKKyAgZG5sIGJlY2F1c2UgcGx1cmFsLnkgdXNlcyBiaXNvbiBzcGVjaWZpYyBmZWF0dXJlcy4gSXQgcmVxdWlyZXMgYXQgbGVhc3QKKyAgZG5sIGJpc29uLTEuMjYgYmVjYXVzZSBlYXJsaWVyIHZlcnNpb25zIGdlbmVyYXRlIGEgcGx1cmFsLmMgdGhhdCBkb2Vzbid0CisgIGRubCBjb21waWxlLgorICBkbmwgYmlzb24gaXMgb25seSBuZWVkZWQgZm9yIHRoZSBtYWludGFpbmVyICh3aG8gdG91Y2hlcyBwbHVyYWwueSkuIEJ1dCBpbgorICBkbmwgb3JkZXIgdG8gYXZvaWQgc2VwYXJhdGUgTWFrZWZpbGVzIG9yIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSwgd2UgcHV0CisgIGRubCB0aGUgcnVsZSBpbiBnZW5lcmFsIE1ha2VmaWxlLiBOb3csIHNvbWUgcGVvcGxlIGNhcmVsZXNzbHkgdG91Y2ggdGhlCisgIGRubCBmaWxlcyBvciBoYXZlIGEgYnJva2VuICJtYWtlIiBwcm9ncmFtLCBoZW5jZSB0aGUgcGx1cmFsLmMgcnVsZSB3aWxsCisgIGRubCBzb21ldGltZXMgZmlyZS4gVG8gYXZvaWQgYW4gZXJyb3IsIGRlZmluZXMgQklTT04gdG8gIjoiIGlmIGl0IGlzIG5vdAorICBkbmwgcHJlc2VudCBvciB0b28gb2xkLgorICBBQ19DSEVDS19QUk9HUyhbSU5UTEJJU09OXSwgW2Jpc29uXSkKKyAgaWYgdGVzdCAteiAiJElOVExCSVNPTiI7IHRoZW4KKyAgICBhY192ZXJjX2ZhaWw9eWVzCisgIGVsc2UKKyAgICBkbmwgRm91bmQgaXQsIG5vdyBjaGVjayB0aGUgdmVyc2lvbi4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3ZlcnNpb24gb2YgYmlzb25dKQorY2hhbmdlcXVvdGUoPDwsPj4pZG5sCisgICAgYWNfcHJvZ192ZXJzaW9uPWAkSU5UTEJJU09OIC0tdmVyc2lvbiAyPiYxIHwgc2VkIC1uICdzL14uKkdOVSBCaXNvbi4qIFwoWzAtOV0qXC5bMC05Ll0qXCkuKiQvXDEvcCdgCisgICAgY2FzZSAkYWNfcHJvZ192ZXJzaW9uIGluCisgICAgICAnJykgYWNfcHJvZ192ZXJzaW9uPSJ2LiA/Lj8/LCBiYWQiOyBhY192ZXJjX2ZhaWw9eWVzOzsKKyAgICAgIDEuMls2LTldKiB8IDEuWzMtOV1bMC05XSogfCBbMi05XS4qKQorY2hhbmdlcXVvdGUoWyxdKWRubAorICAgICAgICAgYWNfcHJvZ192ZXJzaW9uPSIkYWNfcHJvZ192ZXJzaW9uLCBvayI7IGFjX3ZlcmNfZmFpbD1ubzs7CisgICAgICAqKSBhY19wcm9nX3ZlcnNpb249IiRhY19wcm9nX3ZlcnNpb24sIGJhZCI7IGFjX3ZlcmNfZmFpbD15ZXM7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskYWNfcHJvZ192ZXJzaW9uXSkKKyAgZmkKKyAgaWYgdGVzdCAkYWNfdmVyY19mYWlsID0geWVzOyB0aGVuCisgICAgSU5UTEJJU09OPToKKyAgZmkKK10pCisKKworZG5sIGd0X0NIRUNLX0RFQ0woRlVOQywgSU5DTFVERVMpCitkbmwgQ2hlY2sgd2hldGhlciBhIGZ1bmN0aW9uIGlzIGRlY2xhcmVkLgorQUNfREVGVU4oW2d0X0NIRUNLX0RFQ0xdLAorWworICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkMSBpcyBkZWNsYXJlZF0sIGFjX2N2X2hhdmVfZGVjbF8kMSwKKyAgICBbQUNfVFJZX0NPTVBJTEUoWyQyXSwgWworI2lmbmRlZiAkMQorICBjaGFyICpwID0gKGNoYXIgKikgJDE7CisjZW5kaWYKK10sIGFjX2N2X2hhdmVfZGVjbF8kMT15ZXMsIGFjX2N2X2hhdmVfZGVjbF8kMT1ubyldKQorICBpZiB0ZXN0ICRhY19jdl9oYXZlX2RlY2xfJDEgPSB5ZXM7IHRoZW4KKyAgICBndF92YWx1ZT0xCisgIGVsc2UKKyAgICBndF92YWx1ZT0wCisgIGZpCisgIEFDX0RFRklORV9VTlFVT1RFRChbSEFWRV9ERUNMX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgWyRndF92YWx1ZV0sCisgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgJDEnLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuXSkKK10pCisKKworZG5sIFVzYWdlOiBBTV9HTlVfR0VUVEVYVF9WRVJTSU9OKFtnZXR0ZXh0LXZlcnNpb25dKQorQUNfREVGVU4oW0FNX0dOVV9HRVRURVhUX1ZFUlNJT05dLCBbXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9nbGliYzIxLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2dsaWJjMjEubTQJMjAwNC0wOS0xMiAxNDo0MDozNC44MzM2NzU0MzIgLTA0MDAKQEAgLTAsMCArMSwzMiBAQAorIyBnbGliYzIxLm00IHNlcmlhbCAyIChmaWxldXRpbHMtNC4xLjMsIGdldHRleHQtMC4xMC40MCkKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBUZXN0IGZvciB0aGUgR05VIEMgTGlicmFyeSwgdmVyc2lvbiAyLjEgb3IgbmV3ZXIuCisjIEZyb20gQnJ1bm8gSGFpYmxlLgorCitBQ19ERUZVTihbam1fR0xJQkMyMV0sCisgIFsKKyAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgTGlicmFyeSAyLjEgb3IgbmV3ZXIsCisgICAgICBhY19jdl9nbnVfbGlicmFyeV8yXzEsCisgICAgICBbQUNfRUdSRVBfQ1BQKFtMdWNreSBHTlUgdXNlcl0sCisJWworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaWZkZWYgX19HTlVfTElCUkFSWV9fCisgI2lmIChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMSkgfHwgKF9fR0xJQkNfXyA+IDIpCisgIEx1Y2t5IEdOVSB1c2VyCisgI2VuZGlmCisjZW5kaWYKKwldLAorCWFjX2N2X2dudV9saWJyYXJ5XzJfMT15ZXMsCisJYWNfY3ZfZ251X2xpYnJhcnlfMl8xPW5vKQorICAgICAgXQorICAgICkKKyAgICBBQ19TVUJTVChHTElCQzIxKQorICAgIEdMSUJDMjE9IiRhY19jdl9nbnVfbGlicmFyeV8yXzEiCisgIF0KKykKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9pY29udi5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC9pY29udi5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0LjgzOTY3NDUyMCAtMDQwMApAQCAtMCwwICsxLDEwMyBAQAorIyBpY29udi5tNCBzZXJpYWwgQU00IChnZXR0ZXh0LTAuMTEuMykKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorCitBQ19ERUZVTihbQU1fSUNPTlZfTElOS0ZMQUdTX0JPRFldLAorWworICBkbmwgUHJlcmVxdWlzaXRlcyBvZiBBQ19MSUJfTElOS0ZMQUdTX0JPRFkuCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0pCisgIEFDX1JFUVVJUkUoW0FDX0xJQl9SUEFUSF0pCisKKyAgZG5sIFNlYXJjaCBmb3IgbGliaWNvbnYgYW5kIGRlZmluZSBMSUJJQ09OViwgTFRMSUJJQ09OViBhbmQgSU5DSUNPTlYKKyAgZG5sIGFjY29yZGluZ2x5LgorICBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoW2ljb252XSkKK10pCisKK0FDX0RFRlVOKFtBTV9JQ09OVl9MSU5LXSwKK1sKKyAgZG5sIFNvbWUgc3lzdGVtcyBoYXZlIGljb252IGluIGxpYmMsIHNvbWUgaGF2ZSBpdCBpbiBsaWJpY29udiAoT1NGLzEgYW5kCisgIGRubCB0aG9zZSB3aXRoIHRoZSBzdGFuZGFsb25lIHBvcnRhYmxlIEdOVSBsaWJpY29udiBpbnN0YWxsZWQpLgorCisgIGRubCBTZWFyY2ggZm9yIGxpYmljb252IGFuZCBkZWZpbmUgTElCSUNPTlYsIExUTElCSUNPTlYgYW5kIElOQ0lDT05WCisgIGRubCBhY2NvcmRpbmdseS4KKyAgQUNfUkVRVUlSRShbQU1fSUNPTlZfTElOS0ZMQUdTX0JPRFldKQorCisgIGRubCBBZGQgJElOQ0lDT05WIHRvIENQUEZMQUdTIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmcgY2hlY2tzLAorICBkbmwgYmVjYXVzZSBpZiB0aGUgdXNlciBoYXMgaW5zdGFsbGVkIGxpYmljb252IGFuZCBub3QgZGlzYWJsZWQgaXRzIHVzZQorICBkbmwgdmlhIC0td2l0aG91dC1saWJpY29udi1wcmVmaXgsIGhlIHdhbnRzIHRvIHVzZSBpdC4gVGhlIGZpcnN0CisgIGRubCBBQ19UUllfTElOSyB3aWxsIHRoZW4gZmFpbCwgdGhlIHNlY29uZCBBQ19UUllfTElOSyB3aWxsIHN1Y2NlZWQuCisgIGFtX3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgQUNfTElCX0FQUEVORFRPVkFSKFtDUFBGTEFHU10sIFskSU5DSUNPTlZdKQorCisgIEFDX0NBQ0hFX0NIRUNLKGZvciBpY29udiwgYW1fY3ZfZnVuY19pY29udiwgWworICAgIGFtX2N2X2Z1bmNfaWNvbnY9Im5vLCBjb25zaWRlciBpbnN0YWxsaW5nIEdOVSBsaWJpY29udiIKKyAgICBhbV9jdl9saWJfaWNvbnY9bm8KKyAgICBBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+XSwKKyAgICAgIFtpY29udl90IGNkID0gaWNvbnZfb3BlbigiIiwiIik7CisgICAgICAgaWNvbnYoY2QsTlVMTCxOVUxMLE5VTEwsTlVMTCk7CisgICAgICAgaWNvbnZfY2xvc2UoY2QpO10sCisgICAgICBhbV9jdl9mdW5jX2ljb252PXllcykKKyAgICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgIT0geWVzOyB0aGVuCisgICAgICBhbV9zYXZlX0xJQlM9IiRMSUJTIgorICAgICAgTElCUz0iJExJQlMgJExJQklDT05WIgorICAgICAgQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpY29udi5oPl0sCisgICAgICAgIFtpY29udl90IGNkID0gaWNvbnZfb3BlbigiIiwiIik7CisgICAgICAgICBpY29udihjZCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKyAgICAgICAgIGljb252X2Nsb3NlKGNkKTtdLAorICAgICAgICBhbV9jdl9saWJfaWNvbnY9eWVzCisgICAgICAgIGFtX2N2X2Z1bmNfaWNvbnY9eWVzKQorICAgICAgTElCUz0iJGFtX3NhdmVfTElCUyIKKyAgICBmaQorICBdKQorICBpZiB0ZXN0ICIkYW1fY3ZfZnVuY19pY29udiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9JQ09OViwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaWNvbnYoKSBmdW5jdGlvbi5dKQorICBmaQorICBpZiB0ZXN0ICIkYW1fY3ZfbGliX2ljb252IiA9IHllczsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaG93IHRvIGxpbmsgd2l0aCBsaWJpY29udl0pCisgICAgQUNfTVNHX1JFU1VMVChbJExJQklDT05WXSkKKyAgZWxzZQorICAgIGRubCBJZiAkTElCSUNPTlYgZGlkbid0IGxlYWQgdG8gYSB1c2FibGUgbGlicmFyeSwgd2UgZG9uJ3QgbmVlZCAkSU5DSUNPTlYKKyAgICBkbmwgZWl0aGVyLgorICAgIENQUEZMQUdTPSIkYW1fc2F2ZV9DUFBGTEFHUyIKKyAgICBMSUJJQ09OVj0KKyAgICBMVExJQklDT05WPQorICBmaQorICBBQ19TVUJTVChMSUJJQ09OVikKKyAgQUNfU1VCU1QoTFRMSUJJQ09OVikKK10pCisKK0FDX0RFRlVOKFtBTV9JQ09OVl0sCitbCisgIEFNX0lDT05WX0xJTksKKyAgaWYgdGVzdCAiJGFtX2N2X2Z1bmNfaWNvbnYiID0geWVzOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgaWNvbnYgZGVjbGFyYXRpb25dKQorICAgIEFDX0NBQ0hFX1ZBTChhbV9jdl9wcm90b19pY29udiwgWworICAgICAgQUNfVFJZX0NPTVBJTEUoWworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGljb252Lmg+CitleHRlcm4KKyNpZmRlZiBfX2NwbHVzcGx1cworIkMiCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorc2l6ZV90IGljb252IChpY29udl90IGNkLCBjaGFyICogKmluYnVmLCBzaXplX3QgKmluYnl0ZXNsZWZ0LCBjaGFyICogKm91dGJ1Ziwgc2l6ZV90ICpvdXRieXRlc2xlZnQpOworI2Vsc2UKK3NpemVfdCBpY29udigpOworI2VuZGlmCitdLCBbXSwgYW1fY3ZfcHJvdG9faWNvbnZfYXJnMT0iIiwgYW1fY3ZfcHJvdG9faWNvbnZfYXJnMT0iY29uc3QiKQorICAgICAgYW1fY3ZfcHJvdG9faWNvbnY9ImV4dGVybiBzaXplX3QgaWNvbnYgKGljb252X3QgY2QsICRhbV9jdl9wcm90b19pY29udl9hcmcxIGNoYXIgKiAqaW5idWYsIHNpemVfdCAqaW5ieXRlc2xlZnQsIGNoYXIgKiAqb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCk7Il0pCisgICAgYW1fY3ZfcHJvdG9faWNvbnY9YGVjaG8gIlskXWFtX2N2X3Byb3RvX2ljb252IiB8IHRyIC1zICcgJyB8IHNlZCAtZSAncy8oIC8oLydgCisgICAgQUNfTVNHX1JFU1VMVChbJF17YWNfdDotCisgICAgICAgICB9WyRdYW1fY3ZfcHJvdG9faWNvbnYpCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKElDT05WX0NPTlNULCAkYW1fY3ZfcHJvdG9faWNvbnZfYXJnMSwKKyAgICAgIFtEZWZpbmUgYXMgY29uc3QgaWYgdGhlIGRlY2xhcmF0aW9uIG9mIGljb252KCkgbmVlZHMgY29uc3QuXSkKKyAgZmkKK10pCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvaW50ZGl2MC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC9pbnRkaXYwLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODQ1NjczNjA4IC0wNDAwCkBAIC0wLDAgKzEsNzIgQEAKKyMgaW50ZGl2MC5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjExLjMpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCisKK0FDX0RFRlVOKFtndF9JTlRESVYwXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKworICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIFNJR0ZQRV0sCisgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGUsCisgICAgWworICAgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkCisjaWZkZWYgX19jcGx1c3BsdXMKK3NpZ2ZwZV9oYW5kbGVyIChpbnQgc2lnKQorI2Vsc2UKK3NpZ2ZwZV9oYW5kbGVyIChzaWcpIGludCBzaWc7CisjZW5kaWYKK3sKKyAgLyogRXhpdCB3aXRoIGNvZGUgMCBpZiBTSUdGUEUsIHdpdGggY29kZSAxIGlmIGFueSBvdGhlciBzaWduYWwuICAqLworICBleGl0IChzaWcgIT0gU0lHRlBFKTsKK30KKworaW50IHggPSAxOworaW50IHkgPSAwOworaW50IHo7CitpbnQgbmFuOworCitpbnQgbWFpbiAoKQoreworICBzaWduYWwgKFNJR0ZQRSwgc2lnZnBlX2hhbmRsZXIpOworLyogSVJJWCBhbmQgQUlYICh3aGVuICJ4bGMgLXFjaGVjayIgaXMgdXNlZCkgeWllbGQgc2lnbmFsIFNJR1RSQVAuICAqLworI2lmIChkZWZpbmVkIChfX3NnaSkgfHwgZGVmaW5lZCAoX0FJWCkpICYmIGRlZmluZWQgKFNJR1RSQVApCisgIHNpZ25hbCAoU0lHVFJBUCwgc2lnZnBlX2hhbmRsZXIpOworI2VuZGlmCisvKiBMaW51eC9TUEFSQyB5aWVsZHMgc2lnbmFsIFNJR0lMTC4gICovCisjaWYgZGVmaW5lZCAoX19zcGFyY19fKSAmJiBkZWZpbmVkIChfX2xpbnV4X18pCisgIHNpZ25hbCAoU0lHSUxMLCBzaWdmcGVfaGFuZGxlcik7CisjZW5kaWYKKworICB6ID0geCAvIHk7CisgIG5hbiA9IHkgLyB5OworICBleGl0ICgxKTsKK30KK10sIGd0X2N2X2ludF9kaXZieXplcm9fc2lnZnBlPXllcywgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9bm8sCisgICAgICAgIFsKKyAgICAgICAgICAjIEd1ZXNzIGJhc2VkIG9uIHRoZSBDUFUuCisgICAgICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgICAgICAgYWxwaGEqIHwgaVszNDU2N104NiB8IG02OGsgfCBzMzkwKikKKyAgICAgICAgICAgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9Imd1ZXNzaW5nIHllcyI7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgZ3RfY3ZfaW50X2RpdmJ5emVyb19zaWdmcGU9Imd1ZXNzaW5nIG5vIjs7CisgICAgICAgICAgZXNhYworICAgICAgICBdKQorICAgIF0pCisgIGNhc2UgIiRndF9jdl9pbnRfZGl2Ynl6ZXJvX3NpZ2ZwZSIgaW4KKyAgICAqeWVzKSB2YWx1ZT0xOzsKKyAgICAqKSB2YWx1ZT0wOzsKKyAgZXNhYworICBBQ19ERUZJTkVfVU5RVU9URUQoSU5URElWMF9SQUlTRVNfU0lHRlBFLCAkdmFsdWUsCisgICAgW0RlZmluZSBpZiBpbnRlZ2VyIGRpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHNpZ25hbCBTSUdGUEUuXSkKK10pCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvaW50bWF4Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2ludG1heC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljg1NTY3MjA4OCAtMDQwMApAQCAtMCwwICsxLDMyIEBACisjIGludG1heC5tNCBzZXJpYWwgMSAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBCcnVubyBIYWlibGUuCitkbmwgVGVzdCB3aGV0aGVyIHRoZSBzeXN0ZW0gaGFzIHRoZSAnaW50bWF4X3QnIHR5cGUsIGJ1dCBkb24ndCBhdHRlbXB0IHRvCitkbmwgZmluZCBhIHJlcGxhY2VtZW50IGlmIGl0IGlzIGxhY2tpbmcuCisKK0FDX0RFRlVOKFtndF9UWVBFX0lOVE1BWF9UXSwKK1sKKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX0lOVFRZUEVTX0hdKQorICBBQ19SRVFVSVJFKFtqbV9BQ19IRUFERVJfU1RESU5UX0hdKQorICBBQ19DQUNIRV9DSEVDSyhmb3IgaW50bWF4X3QsIGd0X2N2X2NfaW50bWF4X3QsCisgICAgW0FDX1RSWV9DT01QSUxFKFsKKyNpbmNsdWRlIDxzdGRkZWYuaD4gCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWYgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVgKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmIEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVgKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCitdLCBbaW50bWF4X3QgeCA9IC0xO10sIGd0X2N2X2NfaW50bWF4X3Q9eWVzLCBndF9jdl9jX2ludG1heF90PW5vKV0pCisgIGlmIHRlc3QgJGd0X2N2X2NfaW50bWF4X3QgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9JTlRNQVhfVCwgMSwKKyAgICAgIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdpbnRtYXhfdCcgdHlwZSBpbiA8c3RkaW50Lmg+IG9yIDxpbnR0eXBlcy5oPi5dKQorICBmaQorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9pbnR0eXBlc19oLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2ludHR5cGVzX2gubTQJMjAwNC0wOS0xMiAxNDo0MDozNC44Njg2NzAxMTIgLTA0MDAKQEAgLTAsMCArMSwyOCBAQAorIyBpbnR0eXBlc19oLm00IHNlcmlhbCA1IChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorCisjIERlZmluZSBIQVZFX0lOVFRZUEVTX0hfV0lUSF9VSU5UTUFYIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMsCisjIGRvZXNuJ3QgY2xhc2ggd2l0aCA8c3lzL3R5cGVzLmg+LCBhbmQgZGVjbGFyZXMgdWludG1heF90LgorCitBQ19ERUZVTihbam1fQUNfSEVBREVSX0lOVFRZUEVTX0hdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIGludHR5cGVzLmhdLCBqbV9hY19jdl9oZWFkZXJfaW50dHlwZXNfaCwKKyAgW0FDX1RSWV9DT01QSUxFKAorICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD5dLAorICAgIFt1aW50bWF4X3QgaSA9ICh1aW50bWF4X3QpIC0xO10sCisgICAgam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2g9eWVzLAorICAgIGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oPW5vKV0pCisgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9pbnR0eXBlc19oID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKEhBVkVfSU5UVFlQRVNfSF9XSVRIX1VJTlRNQVgsIDEsCisgICAgICBbRGVmaW5lIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMsIGRvZXNuJ3QgY2xhc2ggd2l0aCA8c3lzL3R5cGVzLmg+LAorICAgICAgIGFuZCBkZWNsYXJlcyB1aW50bWF4X3QuIF0pCisgIGZpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2ludHR5cGVzLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2ludHR5cGVzLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODYxNjcxMTc2IC0wNDAwCkBAIC0wLDAgKzEsMjcgQEAKKyMgaW50dHlwZXMubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMS40KQorZG5sIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKworIyBEZWZpbmUgSEFWRV9JTlRUWVBFU19IIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMgYW5kIGRvZXNuJ3QgY2xhc2ggd2l0aAorIyA8c3lzL3R5cGVzLmg+LgorCitBQ19ERUZVTihbZ3RfSEVBREVSX0lOVFRZUEVTX0hdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIGludHR5cGVzLmhdLCBndF9jdl9oZWFkZXJfaW50dHlwZXNfaCwKKyAgWworICAgIEFDX1RSWV9DT01QSUxFKAorICAgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPl0sCisgICAgICBbXSwgZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2g9eWVzLCBndF9jdl9oZWFkZXJfaW50dHlwZXNfaD1ubykKKyAgXSkKKyAgaWYgdGVzdCAkZ3RfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoSEFWRV9JTlRUWVBFU19ILCAxLAorICAgICAgW0RlZmluZSBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkb2Vzbid0IGNsYXNoIHdpdGggPHN5cy90eXBlcy5oPi5dKQorICBmaQorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9pbnR0eXBlcy1wcmkubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvaW50dHlwZXMtcHJpLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuODc0NjY5MjAwIC0wNDAwCkBAIC0wLDAgKzEsMzIgQEAKKyMgaW50dHlwZXMtcHJpLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTEuNCkKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gQnJ1bm8gSGFpYmxlLgorCisjIERlZmluZSBQUklfTUFDUk9TX0JST0tFTiBpZiA8aW50dHlwZXMuaD4gZXhpc3RzIGFuZCBkZWZpbmVzIHRoZSBQUkkqCisjIG1hY3JvcyB0byBub24tc3RyaW5nIHZhbHVlcy4gIFRoaXMgaXMgdGhlIGNhc2Ugb24gQUlYIDQuMy4zLgorCitBQ19ERUZVTihbZ3RfSU5UVFlQRVNfUFJJXSwKK1sKKyAgQUNfUkVRVUlSRShbZ3RfSEVBREVSX0lOVFRZUEVTX0hdKQorICBpZiB0ZXN0ICRndF9jdl9oZWFkZXJfaW50dHlwZXNfaCA9IHllczsgdGhlbgorICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBpbnR0eXBlcy5oIFBSSXhOTiBtYWNyb3MgYXJlIGJyb2tlbl0sCisgICAgICBndF9jdl9pbnR0eXBlc19wcmlfYnJva2VuLAorICAgICAgWworICAgICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWZkZWYgUFJJZDMyCitjaGFyICpwID0gUFJJZDMyOworI2VuZGlmCitdLCBbXSwgZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbj1ubywgZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbj15ZXMpCisgICAgICBdKQorICBmaQorICBpZiB0ZXN0ICIkZ3RfY3ZfaW50dHlwZXNfcHJpX2Jyb2tlbiIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoUFJJX01BQ1JPU19CUk9LRU4sIDEsCisgICAgICBbRGVmaW5lIGlmIDxpbnR0eXBlcy5oPiBleGlzdHMgYW5kIGRlZmluZXMgdW51c2FibGUgUFJJKiBtYWNyb3MuXSkKKyAgZmkKK10pCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvaXNjLXBvc2l4Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2lzYy1wb3NpeC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljg4NTY2NzUyOCAtMDQwMApAQCAtMCwwICsxLDI2IEBACisjIGlzYy1wb3NpeC5tNCBzZXJpYWwgMiAoZ2V0dGV4dC0wLjExLjIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGhpcyBmaWxlIGlzIG5vdCBuZWVkZWQgd2l0aCBhdXRvY29uZi0yLjUzIGFuZCBuZXdlci4gIFJlbW92ZSBpdCBpbiAyMDA1LgorCisjIFRoaXMgdGVzdCByZXBsYWNlcyB0aGUgb25lIGluIGF1dG9jb25mLgorIyBDdXJyZW50bHkgdGhpcyBtYWNybyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhdXRvY29uZiBtYWNybworIyBiZWNhdXNlIGdldHRleHQncyBnZXR0ZXh0Lm00IChkaXN0cmlidXRlZCBpbiB0aGUgYXV0b21ha2UgcGFja2FnZSkKKyMgc3RpbGwgdXNlcyBpdC4gIE90aGVyd2lzZSwgdGhlIHVzZSBpbiBnZXR0ZXh0Lm00IG1ha2VzIGF1dG9oZWFkZXIKKyMgZ2l2ZSB0aGVzZSBkaWFnbm9zdGljczoKKyMgICBjb25maWd1cmUuaW46NTU2OiBBQ19UUllfQ09NUElMRSB3YXMgY2FsbGVkIGJlZm9yZSBBQ19JU0NfUE9TSVgKKyMgICBjb25maWd1cmUuaW46NTU2OiBBQ19UUllfUlVOIHdhcyBjYWxsZWQgYmVmb3JlIEFDX0lTQ19QT1NJWAorCit1bmRlZmluZShbQUNfSVNDX1BPU0lYXSkKKworQUNfREVGVU4oW0FDX0lTQ19QT1NJWF0sCisgIFsKKyAgICBkbmwgVGhpcyB0ZXN0IHJlcGxhY2VzIHRoZSBvYnNvbGVzY2VudCBBQ19JU0NfUE9TSVgga2x1ZGdlLgorICAgIEFDX0NIRUNLX0xJQihjcG9zaXgsIHN0cmVycm9yLCBbTElCUz0iJExJQlMgLWxjcG9zaXgiXSkKKyAgXQorKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2xjbWVzc2FnZS5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC9sY21lc3NhZ2UubTQJMjAwNC0wOS0xMiAxNDo0MDozNC45MDI2NjQ5NDQgLTA0MDAKQEAgLTAsMCArMSwzMiBAQAorIyBsY21lc3NhZ2UubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMS4zKQorZG5sIENvcHlyaWdodCAoQykgMTk5NS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorZG5sCitkbmwgVGhpcyBmaWxlIGNhbiBjYW4gYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlcgorZG5sIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK2RubCBMaWNlbnNlIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0CitkbmwgZnVuY3Rpb25hbGl0eS4KK2RubCBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBvZiB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpcyBjb3ZlcmVkCitkbmwgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFuZCB0aGUgcmVzdCBvZiB0aGUgR05VCitkbmwgZ2V0dGV4dCBwYWNrYWdlIHBhY2thZ2UgaXMgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCitkbmwgVGhleSBhcmUgKm5vdCogaW4gdGhlIHB1YmxpYyBkb21haW4uCisKK2RubCBBdXRob3JzOgorZG5sICAgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTUuCisKKyMgQ2hlY2sgd2hldGhlciBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4KKworQUNfREVGVU4oW0FNX0xDX01FU1NBR0VTXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBMQ19NRVNTQUdFU10sIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUywKKyAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKKyAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKKyAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfTENfTUVTU0FHRVMsIDEsCisgICAgICBbRGVmaW5lIGlmIHlvdXIgPGxvY2FsZS5oPiBmaWxlIGRlZmluZXMgTENfTUVTU0FHRVMuXSkKKyAgZmkKK10pCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvbGliLWxkLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2xpYi1sZC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0LjkwODY2NDAzMiAtMDQwMApAQCAtMCwwICsxLDExMiBAQAorIyBsaWItbGQubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMykKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIFN1YnJvdXRpbmVzIG9mIGxpYnRvb2wubTQsCitkbmwgd2l0aCByZXBsYWNlbWVudHMgcy9BQ18vQUNfTElCLyBhbmQgcy9sdF9jdi9hY2xfY3YvIHRvIGF2b2lkIGNvbGxpc2lvbgorZG5sIHdpdGggbGlidG9vbC5tNC4KKworZG5sIEZyb20gbGlidG9vbC0xLjQuIFNldHMgdGhlIHZhcmlhYmxlIHdpdGhfZ251X2xkIHRvIHllcyBvciBuby4KK0FDX0RFRlVOKFtBQ19MSUJfUFJPR19MRF9HTlVdLAorW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjbF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorY2FzZSBgJExEIC12IDI+JjEgPC9kZXYvbnVsbGAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBhY2xfY3ZfcHJvZ19nbnVfbGQ9eWVzIDs7CisqKQorICBhY2xfY3ZfcHJvZ19nbnVfbGQ9bm8gOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGFjbF9jdl9wcm9nX2dudV9sZAorXSkKKworZG5sIEZyb20gbGlidG9vbC0xLjQuIFNldHMgdGhlIHZhcmlhYmxlIExELgorQUNfREVGVU4oW0FDX0xJQl9QUk9HX0xEXSwKK1tBQ19BUkdfV0lUSChnbnUtbGQsCitbICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKK3Rlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKKyMgUHJlcGFyZSBQQVRIX1NFUEFSQVRPUi4KKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSBHQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopXQorICAgICAgW3JlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLyddCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAorICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKKyAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKKyAgICAgIGRvbmUKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgIiIpCisgICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCisgICAgYWNfcHJvZz1sZAorICAgIDs7CisgICopCisgICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgorICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICA7OworICBlc2FjCitlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKK2Vsc2UKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCitmaQorQUNfQ0FDSEVfVkFMKGFjbF9jdl9wYXRoX0xELAorW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUi06fSIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciIHx8IHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ckYWNfZXhlZXh0IjsgdGhlbgorICAgICAgYWNsX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisgICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCisgICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KKyAgICAgIGNhc2UgYCIkYWNsX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrIDs7CisgICAgICAqKQorCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2Vsc2UKKyAgYWNsX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGFjbF9jdl9wYXRoX0xEIgoraWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRMRCkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2ZpCit0ZXN0IC16ICIkTEQiICYmIEFDX01TR19FUlJPUihbbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEhdKQorQUNfTElCX1BST0dfTERfR05VCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2xpYi1saW5rLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2xpYi1saW5rLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTE0NjYzMTIwIC0wNDAwCkBAIC0wLDAgKzEsNTUxIEBACisjIGxpYi1saW5rLm00IHNlcmlhbCA0IChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworZG5sIEFDX0xJQl9MSU5LRkxBR1MobmFtZSBbLCBkZXBlbmRlbmNpZXNdKSBzZWFyY2hlcyBmb3IgbGlibmFtZSBhbmQKK2RubCB0aGUgbGlicmFyaWVzIGNvcnJlc3BvbmRpbmcgdG8gZXhwbGljaXQgYW5kIGltcGxpY2l0IGRlcGVuZGVuY2llcy4KK2RubCBTZXRzIGFuZCBBQ19TVUJTVHMgdGhlIExJQiR7TkFNRX0gYW5kIExUTElCJHtOQU1FfSB2YXJpYWJsZXMgYW5kCitkbmwgYXVnbWVudHMgdGhlIENQUEZMQUdTIHZhcmlhYmxlLgorQUNfREVGVU4oW0FDX0xJQl9MSU5LRkxBR1NdLAorWworICBBQ19SRVFVSVJFKFtBQ19MSUJfUFJFUEFSRV9QUkVGSVhdKQorICBBQ19SRVFVSVJFKFtBQ19MSUJfUlBBVEhdKQorICBkZWZpbmUoW05hbWVdLFt0cmFuc2xpdChbJDFdLFsuLy1dLCBbX19fXSldKQorICBkZWZpbmUoW05BTUVdLFt0cmFuc2xpdChbJDFdLFthYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fXSldKQorICBBQ19DQUNIRV9DSEVDSyhbaG93IHRvIGxpbmsgd2l0aCBsaWJbXSQxXSwgW2FjX2N2X2xpYltdTmFtZVtdX2xpYnNdLCBbCisgICAgQUNfTElCX0xJTktGTEFHU19CT0RZKFskMV0sIFskMl0pCisgICAgYWNfY3ZfbGliW11OYW1lW11fbGlicz0iJExJQltdTkFNRSIKKyAgICBhY19jdl9saWJbXU5hbWVbXV9sdGxpYnM9IiRMVExJQltdTkFNRSIKKyAgICBhY19jdl9saWJbXU5hbWVbXV9jcHBmbGFncz0iJElOQ1tdTkFNRSIKKyAgXSkKKyAgTElCW11OQU1FPSIkYWNfY3ZfbGliW11OYW1lW11fbGlicyIKKyAgTFRMSUJbXU5BTUU9IiRhY19jdl9saWJbXU5hbWVbXV9sdGxpYnMiCisgIElOQ1tdTkFNRT0iJGFjX2N2X2xpYltdTmFtZVtdX2NwcGZsYWdzIgorICBBQ19MSUJfQVBQRU5EVE9WQVIoW0NQUEZMQUdTXSwgWyRJTkNdTkFNRSkKKyAgQUNfU1VCU1QoW0xJQl1OQU1FKQorICBBQ19TVUJTVChbTFRMSUJdTkFNRSkKKyAgZG5sIEFsc28gc2V0IEhBVkVfTElCW11OQU1FIHNvIHRoYXQgQUNfTElCX0hBVkVfTElOS0ZMQUdTIGNhbiByZXVzZSB0aGUKKyAgZG5sIHJlc3VsdHMgb2YgdGhpcyBzZWFyY2ggd2hlbiB0aGlzIGxpYnJhcnkgYXBwZWFycyBhcyBhIGRlcGVuZGVuY3kuCisgIEhBVkVfTElCW11OQU1FPXllcworICB1bmRlZmluZShbTmFtZV0pCisgIHVuZGVmaW5lKFtOQU1FXSkKK10pCisKK2RubCBBQ19MSUJfSEFWRV9MSU5LRkxBR1MobmFtZSwgZGVwZW5kZW5jaWVzLCBpbmNsdWRlcywgdGVzdGNvZGUpCitkbmwgc2VhcmNoZXMgZm9yIGxpYm5hbWUgYW5kIHRoZSBsaWJyYXJpZXMgY29ycmVzcG9uZGluZyB0byBleHBsaWNpdCBhbmQKK2RubCBpbXBsaWNpdCBkZXBlbmRlbmNpZXMsIHRvZ2V0aGVyIHdpdGggdGhlIHNwZWNpZmllZCBpbmNsdWRlIGZpbGVzIGFuZAorZG5sIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgYW5kIGxpbmsgdGhlIHNwZWNpZmllZCB0ZXN0Y29kZS4gSWYgZm91bmQsIGl0Citkbmwgc2V0cyBhbmQgQUNfU1VCU1RzIEhBVkVfTElCJHtOQU1FfT15ZXMgYW5kIHRoZSBMSUIke05BTUV9IGFuZAorZG5sIExUTElCJHtOQU1FfSB2YXJpYWJsZXMgYW5kIGF1Z21lbnRzIHRoZSBDUFBGTEFHUyB2YXJpYWJsZSwgYW5kCitkbmwgI2RlZmluZXMgSEFWRV9MSUIke05BTUV9IHRvIDEuIE90aGVyd2lzZSwgaXQgc2V0cyBhbmQgQUNfU1VCU1RzCitkbmwgSEFWRV9MSUIke05BTUV9PW5vIGFuZCBMSUIke05BTUV9IGFuZCBMVExJQiR7TkFNRX0gdG8gZW1wdHkuCitBQ19ERUZVTihbQUNfTElCX0hBVkVfTElOS0ZMQUdTXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKyAgQUNfUkVRVUlSRShbQUNfTElCX1JQQVRIXSkKKyAgZGVmaW5lKFtOYW1lXSxbdHJhbnNsaXQoWyQxXSxbLi8tXSwgW19fX10pXSkKKyAgZGVmaW5lKFtOQU1FXSxbdHJhbnNsaXQoWyQxXSxbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX10pXSkKKworICBkbmwgU2VhcmNoIGZvciBsaWJbXU5hbWUgYW5kIGRlZmluZSBMSUJbXU5BTUUsIExUTElCW11OQU1FIGFuZCBJTkNbXU5BTUUKKyAgZG5sIGFjY29yZGluZ2x5LgorICBBQ19MSUJfTElOS0ZMQUdTX0JPRFkoWyQxXSwgWyQyXSkKKworICBkbmwgQWRkICRJTkNbXU5BTUUgdG8gQ1BQRkxBR1MgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZyBjaGVja3MsCisgIGRubCBiZWNhdXNlIGlmIHRoZSB1c2VyIGhhcyBpbnN0YWxsZWQgbGliW11OYW1lIGFuZCBub3QgZGlzYWJsZWQgaXRzIHVzZQorICBkbmwgdmlhIC0td2l0aG91dC1saWJbXU5hbWUtcHJlZml4LCBoZSB3YW50cyB0byB1c2UgaXQuCisgIGFjX3NhdmVfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgQUNfTElCX0FQUEVORFRPVkFSKFtDUFBGTEFHU10sIFskSU5DXU5BTUUpCisKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsaWJbXSQxXSwgW2FjX2N2X2xpYltdTmFtZV0sIFsKKyAgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRMSUJTICRMSUJbXU5BTUUiCisgICAgQUNfVFJZX0xJTksoWyQzXSwgWyQ0XSwgW2FjX2N2X2xpYltdTmFtZT15ZXNdLCBbYWNfY3ZfbGliW11OYW1lPW5vXSkKKyAgICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorICBdKQorICBpZiB0ZXN0ICIkYWNfY3ZfbGliW11OYW1lIiA9IHllczsgdGhlbgorICAgIEhBVkVfTElCW11OQU1FPXllcworICAgIEFDX0RFRklORShbSEFWRV9MSUJdTkFNRSwgMSwgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJDEgbGlicmFyeS5dKQorICAgIEFDX01TR19DSEVDS0lORyhbaG93IHRvIGxpbmsgd2l0aCBsaWJbXSQxXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskTElCW11OQU1FXSkKKyAgZWxzZQorICAgIEhBVkVfTElCW11OQU1FPW5vCisgICAgZG5sIElmICRMSUJbXU5BTUUgZGlkbid0IGxlYWQgdG8gYSB1c2FibGUgbGlicmFyeSwgd2UgZG9uJ3QgbmVlZAorICAgIGRubCAkSU5DW11OQU1FIGVpdGhlci4KKyAgICBDUFBGTEFHUz0iJGFjX3NhdmVfQ1BQRkxBR1MiCisgICAgTElCW11OQU1FPQorICAgIExUTElCW11OQU1FPQorICBmaQorICBBQ19TVUJTVChbSEFWRV9MSUJdTkFNRSkKKyAgQUNfU1VCU1QoW0xJQl1OQU1FKQorICBBQ19TVUJTVChbTFRMSUJdTkFNRSkKKyAgdW5kZWZpbmUoW05hbWVdKQorICB1bmRlZmluZShbTkFNRV0pCitdKQorCitkbmwgRGV0ZXJtaW5lIHRoZSBwbGF0Zm9ybSBkZXBlbmRlbnQgcGFyYW1ldGVycyBuZWVkZWQgdG8gdXNlIHJwYXRoOgorZG5sIGxpYmV4dCwgc2hsaWJleHQsIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsCitkbmwgaGFyZGNvZGVfZGlyZWN0LCBoYXJkY29kZV9taW51c19MLgorQUNfREVGVU4oW0FDX0xJQl9SUEFUSF0sCitbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKSAgICAgICAgICAgICAgICBkbmwgd2UgdXNlICRDQywgJEdDQywgJExERkxBR1MKKyAgQUNfUkVRVUlSRShbQUNfTElCX1BST0dfTERdKSAgICAgICAgICAgIGRubCB3ZSB1c2UgJExELCAkd2l0aF9nbnVfbGQKKyAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKSAgICAgICAgIGRubCB3ZSB1c2UgJGhvc3QKKyAgQUNfUkVRVUlSRShbQUNfQ09ORklHX0FVWF9ESVJfREVGQVVMVF0pIGRubCB3ZSB1c2UgJGFjX2F1eF9kaXIKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzaGFyZWQgbGlicmFyeSBydW4gcGF0aCBvcmlnaW5dLCBhY2xfY3ZfcnBhdGgsIFsKKyAgICBDQz0iJENDIiBHQ0M9IiRHQ0MiIExERkxBR1M9IiRMREZMQUdTIiBMRD0iJExEIiB3aXRoX2dudV9sZD0iJHdpdGhfZ251X2xkIiBcCisgICAgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gIiRhY19hdXhfZGlyL2NvbmZpZy5ycGF0aCIgIiRob3N0IiA+IGNvbmZ0ZXN0LnNoCisgICAgLiAuL2NvbmZ0ZXN0LnNoCisgICAgcm0gLWYgLi9jb25mdGVzdC5zaAorICAgIGFjbF9jdl9ycGF0aD1kb25lCisgIF0pCisgIHdsPSIkYWNsX2N2X3dsIgorICBsaWJleHQ9IiRhY2xfY3ZfbGliZXh0IgorICBzaGxpYmV4dD0iJGFjbF9jdl9zaGxpYmV4dCIKKyAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGFjbF9jdl9oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIgorICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIkYWNsX2N2X2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiCisgIGhhcmRjb2RlX2RpcmVjdD0iJGFjbF9jdl9oYXJkY29kZV9kaXJlY3QiCisgIGhhcmRjb2RlX21pbnVzX0w9IiRhY2xfY3ZfaGFyZGNvZGVfbWludXNfTCIKKyAgZG5sIERldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIHJwYXRoIGhhbmRsaW5nIGF0IGFsbC4KKyAgQUNfQVJHX0VOQUJMRShycGF0aCwKKyAgICBbICAtLWRpc2FibGUtcnBhdGggICAgICAgICBkbyBub3QgaGFyZGNvZGUgcnVudGltZSBsaWJyYXJ5IHBhdGhzXSwKKyAgICA6LCBlbmFibGVfcnBhdGg9eWVzKQorXSkKKworZG5sIEFDX0xJQl9MSU5LRkxBR1NfQk9EWShuYW1lIFssIGRlcGVuZGVuY2llc10pIHNlYXJjaGVzIGZvciBsaWJuYW1lIGFuZAorZG5sIHRoZSBsaWJyYXJpZXMgY29ycmVzcG9uZGluZyB0byBleHBsaWNpdCBhbmQgaW1wbGljaXQgZGVwZW5kZW5jaWVzLgorZG5sIFNldHMgdGhlIExJQiR7TkFNRX0sIExUTElCJHtOQU1FfSBhbmQgSU5DJHtOQU1FfSB2YXJpYWJsZXMuCitBQ19ERUZVTihbQUNfTElCX0xJTktGTEFHU19CT0RZXSwKK1sKKyAgZGVmaW5lKFtOQU1FXSxbdHJhbnNsaXQoWyQxXSxbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX10pXSkKKyAgZG5sIEJ5IGRlZmF1bHQsIGxvb2sgaW4gJGluY2x1ZGVkaXIgYW5kICRsaWJkaXIuCisgIHVzZV9hZGRpdGlvbmFsPXllcworICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoWworICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKyAgXSkKKyAgQUNfTElCX0FSR19XSVRIKFtsaWIkMS1wcmVmaXhdLAorWyAgLS13aXRoLWxpYiQxLXByZWZpeFs9RElSXSAgc2VhcmNoIGZvciBsaWIkMSBpbiBESVIvaW5jbHVkZSBhbmQgRElSL2xpYgorICAtLXdpdGhvdXQtbGliJDEtcHJlZml4ICAgICBkb24ndCBzZWFyY2ggZm9yIGxpYiQxIGluIGluY2x1ZGVkaXIgYW5kIGxpYmRpcl0sCitbCisgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25hbD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj1cIiRpbmNsdWRlZGlyXCIKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfbGliZGlyPVwiJGxpYmRpclwiCisgICAgICAgIF0pCisgICAgICBlbHNlCisgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJHdpdGh2YWwvaW5jbHVkZSIKKyAgICAgICAgYWRkaXRpb25hbF9saWJkaXI9IiR3aXRodmFsL2xpYiIKKyAgICAgIGZpCisgICAgZmkKK10pCisgIGRubCBTZWFyY2ggdGhlIGxpYnJhcnkgYW5kIGl0cyBkZXBlbmRlbmNpZXMgaW4gJGFkZGl0aW9uYWxfbGliZGlyIGFuZAorICBkbmwgJExERkxBR1MuIFVzaW5nIGJyZWFkdGgtZmlyc3Qtc2VhY2guCisgIExJQltdTkFNRT0KKyAgTFRMSUJbXU5BTUU9CisgIElOQ1tdTkFNRT0KKyAgcnBhdGhkaXJzPQorICBsdHJwYXRoZGlycz0KKyAgbmFtZXNfYWxyZWFkeV9oYW5kbGVkPQorICBuYW1lc19uZXh0X3JvdW5kPSckMSAkMicKKyAgd2hpbGUgdGVzdCAtbiAiJG5hbWVzX25leHRfcm91bmQiOyBkbworICAgIG5hbWVzX3RoaXNfcm91bmQ9IiRuYW1lc19uZXh0X3JvdW5kIgorICAgIG5hbWVzX25leHRfcm91bmQ9CisgICAgZm9yIG5hbWUgaW4gJG5hbWVzX3RoaXNfcm91bmQ7IGRvCisgICAgICBhbHJlYWR5X2hhbmRsZWQ9CisgICAgICBmb3IgbiBpbiAkbmFtZXNfYWxyZWFkeV9oYW5kbGVkOyBkbworICAgICAgICBpZiB0ZXN0ICIkbiIgPSAiJG5hbWUiOyB0aGVuCisgICAgICAgICAgYWxyZWFkeV9oYW5kbGVkPXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IC16ICIkYWxyZWFkeV9oYW5kbGVkIjsgdGhlbgorICAgICAgICBuYW1lc19hbHJlYWR5X2hhbmRsZWQ9IiRuYW1lc19hbHJlYWR5X2hhbmRsZWQgJG5hbWUiCisgICAgICAgIGRubCBTZWUgaWYgaXQgd2FzIGFscmVhZHkgbG9jYXRlZCBieSBhbiBlYXJsaWVyIEFDX0xJQl9MSU5LRkxBR1MKKyAgICAgICAgZG5sIG9yIEFDX0xJQl9IQVZFX0xJTktGTEFHUyBjYWxsLgorICAgICAgICB1cHBlcm5hbWU9YGVjaG8gIiRuYW1lIiB8IHNlZCAtZSAneXxhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLXxBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX3wnYAorICAgICAgICBldmFsIHZhbHVlPVwiXCRIQVZFX0xJQiR1cHBlcm5hbWVcIgorICAgICAgICBpZiB0ZXN0IC1uICIkdmFsdWUiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAiJHZhbHVlIiA9IHllczsgdGhlbgorICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTElCJHVwcGVybmFtZVwiCisgICAgICAgICAgICB0ZXN0IC16ICIkdmFsdWUiIHx8IExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9JHZhbHVlIgorICAgICAgICAgICAgZXZhbCB2YWx1ZT1cIlwkTFRMSUIkdXBwZXJuYW1lXCIKKyAgICAgICAgICAgIHRlc3QgLXogIiR2YWx1ZSIgfHwgTFRMSUJbXU5BTUU9IiR7TFRMSUJbXU5BTUV9JHtMVExJQltdTkFNRTorIH0kdmFsdWUiCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZG5sIEFuIGVhcmxpZXIgY2FsbCB0byBBQ19MSUJfSEFWRV9MSU5LRkxBR1MgaGFzIGRldGVybWluZWQKKyAgICAgICAgICAgIGRubCB0aGF0IHRoaXMgbGlicmFyeSBkb2Vzbid0IGV4aXN0LiBTbyBqdXN0IGRyb3AgaXQuCisgICAgICAgICAgICA6CisgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRubCBTZWFyY2ggdGhlIGxpYnJhcnkgbGliJG5hbWUgaW4gJGFkZGl0aW9uYWxfbGliZGlyIGFuZCAkTERGTEFHUworICAgICAgICAgIGRubCBhbmQgdGhlIGFscmVhZHkgY29uc3RydWN0ZWQgJExJQk5BTUUvJExUTElCTkFNRS4KKyAgICAgICAgICBmb3VuZF9kaXI9CisgICAgICAgICAgZm91bmRfbGE9CisgICAgICAgICAgZm91bmRfc289CisgICAgICAgICAgZm91bmRfYT0KKyAgICAgICAgICBpZiB0ZXN0ICR1c2VfYWRkaXRpb25hbCA9IHllczsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJHNobGliZXh0IjsgdGhlbgorICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgZm91bmRfc289IiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS4kc2hsaWJleHQiCisgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRhZGRpdGlvbmFsX2xpYmRpci9saWIkbmFtZS5sYSI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRhZGRpdGlvbmFsX2xpYmRpciIKKyAgICAgICAgICAgICAgICBmb3VuZF9hPSIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUuJGxpYmV4dCIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1mICIkYWRkaXRpb25hbF9saWJkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGFkZGl0aW9uYWxfbGliZGlyL2xpYiRuYW1lLmxhIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiID0gIlgiOyB0aGVuCisgICAgICAgICAgICBmb3IgeCBpbiAkTERGTEFHUyAkTFRMSUJbXU5BTUU7IGRvCisgICAgICAgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgICAgICAgIGNhc2UgIiR4IiBpbgorICAgICAgICAgICAgICAgIC1MKikKKyAgICAgICAgICAgICAgICAgIGRpcj1gZWNobyAiWCR4IiB8IHNlZCAtZSAncy9eWC1MLy8nYAorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHNobGliZXh0IiAmJiB0ZXN0IC1mICIkZGlyL2xpYiRuYW1lLiRzaGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm91bmRfZGlyPSIkZGlyIgorICAgICAgICAgICAgICAgICAgICBmb3VuZF9zbz0iJGRpci9saWIkbmFtZS4kc2hsaWJleHQiCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfbGE9IiRkaXIvbGliJG5hbWUubGEiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUuJGxpYmV4dCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9kaXI9IiRkaXIiCisgICAgICAgICAgICAgICAgICAgICAgZm91bmRfYT0iJGRpci9saWIkbmFtZS4kbGliZXh0IgorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRkaXIvbGliJG5hbWUubGEiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9sYT0iJGRpci9saWIkbmFtZS5sYSIKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9kaXIiICE9ICJYIjsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgZmkKKyAgICAgICAgICBpZiB0ZXN0ICJYJGZvdW5kX2RpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICBkbmwgRm91bmQgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1MJGZvdW5kX2RpciAtbCRuYW1lIgorICAgICAgICAgICAgaWYgdGVzdCAiWCRmb3VuZF9zbyIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgIGRubCBMaW5raW5nIHdpdGggYSBzaGFyZWQgbGlicmFyeS4gV2UgYXR0ZW1wdCB0byBoYXJkY29kZSBpdHMKKyAgICAgICAgICAgICAgZG5sIGRpcmVjdG9yeSBpbnRvIHRoZSBleGVjdXRhYmxlJ3MgcnVucGF0aCwgdW5sZXNzIGl0J3MgdGhlCisgICAgICAgICAgICAgIGRubCBzdGFuZGFyZCAvdXNyL2xpYi4KKyAgICAgICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZV9ycGF0aCIgPSBubyB8fCB0ZXN0ICJYJGZvdW5kX2RpciIgPSAiWC91c3IvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgIGRubCBObyBoYXJkY29kaW5nIGlzIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRubCBVc2UgYW4gZXhwbGljaXQgb3B0aW9uIHRvIGhhcmRjb2RlIERJUiBpbnRvIHRoZSByZXN1bHRpbmcKKyAgICAgICAgICAgICAgICBkbmwgYmluYXJ5LgorICAgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgRElSIHRvIGx0cnBhdGhkaXJzLgorICAgICAgICAgICAgICAgIGRubCBUaGUgbHRycGF0aGRpcnMgd2lsbCBiZSBhcHBlbmRlZCB0byAkTFRMSUJOQU1FIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgIGZvciB4IGluICRsdHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGhhdmVpdD15ZXMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICBsdHJwYXRoZGlycz0iJGx0cnBhdGhkaXJzICRmb3VuZF9kaXIiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBkbmwgVGhlIGhhcmRjb2RpbmcgaW50byAkTElCTkFNRSBpcyBzeXN0ZW0gZGVwZW5kZW50LgorICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgICAgICBkbmwgVXNpbmcgRElSL2xpYk5BTUUuc28gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzIERJUiBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgZG5sIHJlc3VsdGluZyBiaW5hcnkuCisgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgJiYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZG5sIFVzZSBhbiBleHBsaWNpdCBvcHRpb24gdG8gaGFyZGNvZGUgRElSIGludG8gdGhlIHJlc3VsdGluZworICAgICAgICAgICAgICAgICAgICBkbmwgYmluYXJ5LgorICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCBESVIgdG8gcnBhdGhkaXJzLgorICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIHJwYXRoZGlycyB3aWxsIGJlIGFwcGVuZGVkIHRvICRMSUJOQU1FIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJHJwYXRoZGlyczsgZG8KKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZm91bmRfZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRmb3VuZF9kaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRubCBSZWx5IG9uICItTCRmb3VuZF9kaXIiLgorICAgICAgICAgICAgICAgICAgICBkbmwgQnV0IGRvbid0IGFkZCBpdCBpZiBpdCdzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBMREZMQUdTCisgICAgICAgICAgICAgICAgICAgIGRubCBvciB0aGUgYWxyZWFkeSBjb25zdHJ1Y3RlZCAkTElCTkFNRQorICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRMREZMQUdTICRMSUJbXU5BTUU7IGRvCisgICAgICAgICAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRmb3VuZF9kaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1MJGZvdW5kX2RpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIEZJWE1FOiBOb3Qgc3VyZSB3aGV0aGVyIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgIi1MJGZvdW5kX2RpciAtbCRuYW1lIiBvciAiLUwkZm91bmRfZGlyICRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGRubCBXZSBjYW5ub3QgdXNlICRoYXJkY29kZV9ydW5wYXRoX3ZhciBhbmQgTERfUlVOX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZSwgYmVjYXVzZSB0aGlzIGRvZXNuJ3QgZml0IGluIGZsYWdzIHBhc3NlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgY29tcGlsZXIuIFNvIGdpdmUgdXAuIE5vIGhhcmRjb2RpbmcuIFRoaXMgYWZmZWN0cyBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgZG5sIHZlcnkgb2xkIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIEZJWE1FOiBOb3Qgc3VyZSB3aGV0aGVyIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgIi1MJGZvdW5kX2RpciAtbCRuYW1lIiBvciAiLUwkZm91bmRfZGlyICRmb3VuZF9zbyIKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfS1sJG5hbWUiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmIHRlc3QgIlgkZm91bmRfYSIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgICAgZG5sIExpbmtpbmcgd2l0aCBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9JGZvdW5kX2EiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkbmwgV2Ugc2hvdWxkbid0IGNvbWUgaGVyZSwgYnV0IGFueXdheSBpdCdzIGdvb2QgdG8gaGF2ZSBhCisgICAgICAgICAgICAgICAgZG5sIGZhbGxiYWNrLgorICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LUwkZm91bmRfZGlyIC1sJG5hbWUiCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG5sIEFzc3VtZSB0aGUgaW5jbHVkZSBmaWxlcyBhcmUgbmVhcmJ5LgorICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPQorICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2RpciIgaW4KKyAgICAgICAgICAgICAgKi9saWIgfCAqL2xpYi8pCisgICAgICAgICAgICAgICAgYmFzZWRpcj1gZWNobyAiWCRmb3VuZF9kaXIiIHwgc2VkIC1lICdzLF5YLCwnIC1lICdzLC9saWIvKiQsLCdgCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9pbmNsdWRlZGlyPSIkYmFzZWRpci9pbmNsdWRlIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgiOyB0aGVuCisgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkSU5DTkFNRS4KKyAgICAgICAgICAgICAgZG5sIEJ1dCBkb24ndCBhZGQgaXQKKyAgICAgICAgICAgICAgZG5sICAgMS4gaWYgaXQncyB0aGUgc3RhbmRhcmQgL3Vzci9pbmNsdWRlLAorICAgICAgICAgICAgICBkbmwgICAyLiBpZiBpdCdzIC91c3IvbG9jYWwvaW5jbHVkZSBhbmQgd2UgYXJlIHVzaW5nIEdDQyBvbiBMaW51eCwKKyAgICAgICAgICAgICAgZG5sICAgMy4gaWYgaXQncyBhbHJlYWR5IHByZXNlbnQgaW4gJENQUEZMQUdTIG9yIHRoZSBhbHJlYWR5CisgICAgICAgICAgICAgIGRubCAgICAgIGNvbnN0cnVjdGVkICRJTkNOQU1FLAorICAgICAgICAgICAgICBkbmwgICA0LiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFzIGEgZGlyZWN0b3J5LgorICAgICAgICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgvdXNyL2luY2x1ZGUiOyB0aGVuCisgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiA9ICJYL3Vzci9sb2NhbC9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJENQUEZMQUdTICRJTkNbXU5BTUU7IGRvCisgICAgICAgICAgICAgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2luY2x1ZGVkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkSU5DTkFNRS4KKyAgICAgICAgICAgICAgICAgICAgICBJTkNbXU5BTUU9IiR7SU5DW11OQU1FfSR7SU5DW11OQU1FOisgfS1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkbmwgTG9vayBmb3IgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGZvdW5kX2xhIjsgdGhlbgorICAgICAgICAgICAgICBkbmwgUmVhZCB0aGUgLmxhIGZpbGUuIEl0IGRlZmluZXMgdGhlIHZhcmlhYmxlcworICAgICAgICAgICAgICBkbmwgZGxuYW1lLCBsaWJyYXJ5X25hbWVzLCBvbGRfbGlicmFyeSwgZGVwZW5kZW5jeV9saWJzLCBjdXJyZW50LAorICAgICAgICAgICAgICBkbmwgYWdlLCByZXZpc2lvbiwgaW5zdGFsbGVkLCBkbG9wZW4sIGRscHJlb3BlbiwgbGliZGlyLgorICAgICAgICAgICAgICBzYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgICAgICAgICAgY2FzZSAiJGZvdW5kX2xhIiBpbgorICAgICAgICAgICAgICAgICovKiB8ICpcXCopIC4gIiRmb3VuZF9sYSIgOzsKKyAgICAgICAgICAgICAgICAqKSAuICIuLyRmb3VuZF9sYSIgOzsKKyAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICBsaWJkaXI9IiRzYXZlX2xpYmRpciIKKyAgICAgICAgICAgICAgZG5sIFdlIHVzZSBvbmx5IGRlcGVuZGVuY3lfbGlicy4KKyAgICAgICAgICAgICAgZm9yIGRlcCBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworICAgICAgICAgICAgICAgIGNhc2UgIiRkZXAiIGluCisgICAgICAgICAgICAgICAgICAtTCopCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxfbGliZGlyPWBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtTC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgZG5sIFBvdGVudGlhbGx5IGFkZCAkYWRkaXRpb25hbF9saWJkaXIgdG8gJExJQk5BTUUgYW5kICRMVExJQk5BTUUuCisgICAgICAgICAgICAgICAgICAgIGRubCBCdXQgZG9uJ3QgYWRkIGl0CisgICAgICAgICAgICAgICAgICAgIGRubCAgIDEuIGlmIGl0J3MgdGhlIHN0YW5kYXJkIC91c3IvbGliLAorICAgICAgICAgICAgICAgICAgICBkbmwgICAyLiBpZiBpdCdzIC91c3IvbG9jYWwvbGliIGFuZCB3ZSBhcmUgdXNpbmcgR0NDIG9uIExpbnV4LAorICAgICAgICAgICAgICAgICAgICBkbmwgICAzLiBpZiBpdCdzIGFscmVhZHkgcHJlc2VudCBpbiAkTERGTEFHUyBvciB0aGUgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICBkbmwgICAgICBjb25zdHJ1Y3RlZCAkTElCTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgZG5sICAgNC4gaWYgaXQgZG9lc24ndCBleGlzdCBhcyBhIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgIT0gIlgvdXNyL2xpYiI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9CisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCRhZGRpdGlvbmFsX2xpYmRpciIgPSAiWC91c3IvbG9jYWwvbGliIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExJQltdTkFNRTsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMSUJOQU1FLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gJExERkxBR1MgJExUTElCW11OQU1FOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW2V2YWwgeD1cIiR4XCJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgtTCRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmwgUmVhbGx5IGFkZCAkYWRkaXRpb25hbF9saWJkaXIgdG8gJExUTElCTkFNRS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1MJGFkZGl0aW9uYWxfbGliZGlyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgLVIqKQorICAgICAgICAgICAgICAgICAgICBkaXI9YGVjaG8gIlgkZGVwIiB8IHNlZCAtZSAncy9eWC1SLy8nYAorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkZW5hYmxlX3JwYXRoIiAhPSBubzsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgIGRubCBQb3RlbnRpYWxseSBhZGQgRElSIHRvIHJwYXRoZGlycy4KKyAgICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIHJwYXRoZGlycyB3aWxsIGJlIGFwcGVuZGVkIHRvICRMSUJOQU1FIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgICAgaGF2ZWl0PQorICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluICRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgcnBhdGhkaXJzPSIkcnBhdGhkaXJzICRkaXIiCisgICAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICAgICAgICBkbmwgUG90ZW50aWFsbHkgYWRkIERJUiB0byBsdHJwYXRoZGlycy4KKyAgICAgICAgICAgICAgICAgICAgICBkbmwgVGhlIGx0cnBhdGhkaXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gJExUTElCTkFNRSBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICAgICAgICAgIGhhdmVpdD0KKyAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJYJHgiID0gIlgkZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgbHRycGF0aGRpcnM9IiRsdHJwYXRoZGlycyAkZGlyIgorICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgICAtbCopCisgICAgICAgICAgICAgICAgICAgIGRubCBIYW5kbGUgdGhpcyBpbiB0aGUgbmV4dCByb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MvXlgtbC8vJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICoubGEpCisgICAgICAgICAgICAgICAgICAgIGRubCBIYW5kbGUgdGhpcyBpbiB0aGUgbmV4dCByb3VuZC4gVGhyb3cgYXdheSB0aGUgLmxhJ3MKKyAgICAgICAgICAgICAgICAgICAgZG5sIGRpcmVjdG9yeTsgaXQgaXMgYWxyZWFkeSBjb250YWluZWQgaW4gYSBwcmVjZWRpbmcgLUwKKyAgICAgICAgICAgICAgICAgICAgZG5sIG9wdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgbmFtZXNfbmV4dF9yb3VuZD0iJG5hbWVzX25leHRfcm91bmQgImBlY2hvICJYJGRlcCIgfCBzZWQgLWUgJ3MsXlguKi8sLCcgLWUgJ3MsXmxpYiwsJyAtZSAncyxcLmxhJCwsJ2AKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgICAgIGRubCBNb3N0IGxpa2VseSBhbiBpbW1lZGlhdGUgbGlicmFyeSBuYW1lLgorICAgICAgICAgICAgICAgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRkZXAiCisgICAgICAgICAgICAgICAgICAgIExUTElCW11OQU1FPSIke0xUTElCW11OQU1FfSR7TFRMSUJbXU5BTUU6KyB9JGRlcCIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZG5sIERpZG4ndCBmaW5kIHRoZSBsaWJyYXJ5OyBhc3N1bWUgaXQgaXMgaW4gdGhlIHN5c3RlbSBkaXJlY3RvcmllcworICAgICAgICAgICAgZG5sIGtub3duIHRvIHRoZSBsaW5rZXIgYW5kIHJ1bnRpbWUgbG9hZGVyLiAoQWxsIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgIGRubCBkaXJlY3RvcmllcyBrbm93biB0byB0aGUgbGlua2VyIHNob3VsZCBhbHNvIGJlIGtub3duIHRvIHRoZQorICAgICAgICAgICAgZG5sIHJ1bnRpbWUgbG9hZGVyLCBvdGhlcndpc2UgdGhlIHN5c3RlbSBpcyBzZXZlcmVseSBtaXNjb25maWd1cmVkLikKKyAgICAgICAgICAgIExJQltdTkFNRT0iJHtMSUJbXU5BTUV9JHtMSUJbXU5BTUU6KyB9LWwkbmFtZSIKKyAgICAgICAgICAgIExUTElCW11OQU1FPSIke0xUTElCW11OQU1FfSR7TFRMSUJbXU5BTUU6KyB9LWwkbmFtZSIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKKyAgaWYgdGVzdCAiWCRycGF0aGRpcnMiICE9ICJYIjsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorICAgICAgZG5sIFdlaXJkIHBsYXRmb3JtOiBvbmx5IHRoZSBsYXN0IC1ycGF0aCBvcHRpb24gY291bnRzLCB0aGUgdXNlciBtdXN0CisgICAgICBkbmwgcGFzcyBhbGwgcGF0aCBlbGVtZW50cyBpbiBvbmUgb3B0aW9uLiBXZSBjYW4gYXJyYW5nZSB0aGF0IGZvciBhCisgICAgICBkbmwgc2luZ2xlIGxpYnJhcnksIGJ1dCBub3Qgd2hlbiBtb3JlIHRoYW4gb25lICRMSUJOQU1FcyBhcmUgdXNlZC4KKyAgICAgIGFsbGRpcnM9CisgICAgICBmb3IgZm91bmRfZGlyIGluICRycGF0aGRpcnM7IGRvCisgICAgICAgIGFsbGRpcnM9IiR7YWxsZGlyc30ke2FsbGRpcnM6KyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yfSRmb3VuZF9kaXIiCisgICAgICBkb25lCisgICAgICBkbmwgTm90ZTogaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyB1c2VzICRsaWJkaXIgYW5kICR3bC4KKyAgICAgIGFjbF9zYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgIGxpYmRpcj0iJGFsbGRpcnMiCisgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICBsaWJkaXI9IiRhY2xfc2F2ZV9saWJkaXIiCisgICAgICBMSUJbXU5BTUU9IiR7TElCW11OQU1FfSR7TElCW11OQU1FOisgfSRmbGFnIgorICAgIGVsc2UKKyAgICAgIGRubCBUaGUgLXJwYXRoIG9wdGlvbnMgYXJlIGN1bXVsYXRpdmUuCisgICAgICBmb3IgZm91bmRfZGlyIGluICRycGF0aGRpcnM7IGRvCisgICAgICAgIGFjbF9zYXZlX2xpYmRpcj0iJGxpYmRpciIKKyAgICAgICAgbGliZGlyPSIkZm91bmRfZGlyIgorICAgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisgICAgICAgIGxpYmRpcj0iJGFjbF9zYXZlX2xpYmRpciIKKyAgICAgICAgTElCW11OQU1FPSIke0xJQltdTkFNRX0ke0xJQltdTkFNRTorIH0kZmxhZyIKKyAgICAgIGRvbmUKKyAgICBmaQorICBmaQorICBpZiB0ZXN0ICJYJGx0cnBhdGhkaXJzIiAhPSAiWCI7IHRoZW4KKyAgICBkbmwgV2hlbiB1c2luZyBsaWJ0b29sLCB0aGUgb3B0aW9uIHRoYXQgd29ya3MgZm9yIGJvdGggbGlicmFyaWVzIGFuZAorICAgIGRubCBleGVjdXRhYmxlcyBpcyAtUi4gVGhlIC1SIG9wdGlvbnMgYXJlIGN1bXVsYXRpdmUuCisgICAgZm9yIGZvdW5kX2RpciBpbiAkbHRycGF0aGRpcnM7IGRvCisgICAgICBMVExJQltdTkFNRT0iJHtMVExJQltdTkFNRX0ke0xUTElCW11OQU1FOisgfS1SJGZvdW5kX2RpciIKKyAgICBkb25lCisgIGZpCitdKQorCitkbmwgQUNfTElCX0FQUEVORFRPVkFSKFZBUiwgQ09OVEVOVFMpIGFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIENPTlRFTlRTIHRvIFZBUiwKK2RubCB1bmxlc3MgYWxyZWFkeSBwcmVzZW50IGluIFZBUi4KK2RubCBXb3JrcyBvbmx5IGZvciBDUFBGTEFHUywgbm90IGZvciBMSUIqIHZhcmlhYmxlcyBiZWNhdXNlIHRoYXQgc29tZXRpbWVzCitkbmwgY29udGFpbnMgdHdvIG9yIHRocmVlIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHRoYXQgYmVsb25nIHRvZ2V0aGVyLgorQUNfREVGVU4oW0FDX0xJQl9BUFBFTkRUT1ZBUl0sCitbCisgIGZvciBlbGVtZW50IGluIFskMl07IGRvCisgICAgaGF2ZWl0PQorICAgIGZvciB4IGluICRbJDFdOyBkbworICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWCRlbGVtZW50IjsgdGhlbgorICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgWyQxXT0iJHtbJDFdfSR7WyQxXTorIH0kZWxlbWVudCIKKyAgICBmaQorICBkb25lCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L2xpYi1wcmVmaXgubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvbGliLXByZWZpeC5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0LjkyMTY2MjA1NiAtMDQwMApAQCAtMCwwICsxLDE1NSBAQAorIyBsaWItcHJlZml4Lm00IHNlcmlhbCAzIChnZXR0ZXh0LTAuMTMpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworZG5sIEFDX0xJQl9BUkdfV0lUSCBpcyBzeW5vbnltb3VzIHRvIEFDX0FSR19XSVRIIGluIGF1dG9jb25mLTIuMTMsIGFuZAorZG5sIHNpbWlsYXIgdG8gQUNfQVJHX1dJVEggaW4gYXV0b2NvbmYgMi41Mi4uLjIuNTcgZXhjZXB0IHRoYXQgaXMgZG9lc24ndAorZG5sIHJlcXVpcmUgZXhjZXNzaXZlIGJyYWNrZXRpbmcuCitpZmRlZihbQUNfSEVMUF9TVFJJTkddLAorW0FDX0RFRlVOKFtBQ19MSUJfQVJHX1dJVEhdLCBbQUNfQVJHX1dJVEgoWyQxXSxbWyQyXV0sWyQzXSxbJDRdKV0pXSwKK1tBQ19ERUZVTihbQUNfXVtMSUJfQVJHX1dJVEhdLCBbQUNfQVJHX1dJVEgoWyQxXSxbJDJdLFskM10sWyQ0XSldKV0pCisKK2RubCBBQ19MSUJfUFJFRklYIGFkZHMgdG8gdGhlIENQUEZMQUdTIGFuZCBMREZMQUdTIHRoZSBmbGFncyB0aGF0IGFyZSBuZWVkZWQKK2RubCB0byBhY2Nlc3MgcHJldmlvdXNseSBpbnN0YWxsZWQgbGlicmFyaWVzLiBUaGUgYmFzaWMgYXNzdW1wdGlvbiBpcyB0aGF0CitkbmwgYSB1c2VyIHdpbGwgd2FudCBwYWNrYWdlcyB0byB1c2Ugb3RoZXIgcGFja2FnZXMgaGUgcHJldmlvdXNseSBpbnN0YWxsZWQKK2RubCB3aXRoIHRoZSBzYW1lIC0tcHJlZml4IG9wdGlvbi4KK2RubCBUaGlzIG1hY3JvIGlzIG5vdCBuZWVkZWQgaWYgb25seSBBQ19MSUJfTElOS0ZMQUdTIGlzIHVzZWQgdG8gbG9jYXRlCitkbmwgbGlicmFyaWVzLCBidXQgaXMgb3RoZXJ3aXNlIHZlcnkgY29udmVuaWVudC4KK0FDX0RFRlVOKFtBQ19MSUJfUFJFRklYXSwKK1sKKyAgQUNfQkVGT1JFKFskMF0sIFtBQ19MSUJfTElOS0ZMQUdTXSkKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCisgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKKyAgQUNfUkVRVUlSRShbQUNfTElCX1BSRVBBUkVfUFJFRklYXSkKKyAgZG5sIEJ5IGRlZmF1bHQsIGxvb2sgaW4gJGluY2x1ZGVkaXIgYW5kICRsaWJkaXIuCisgIHVzZV9hZGRpdGlvbmFsPXllcworICBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoWworICAgIGV2YWwgYWRkaXRpb25hbF9pbmNsdWRlZGlyPVwiJGluY2x1ZGVkaXJcIgorICAgIGV2YWwgYWRkaXRpb25hbF9saWJkaXI9XCIkbGliZGlyXCIKKyAgXSkKKyAgQUNfTElCX0FSR19XSVRIKFtsaWItcHJlZml4XSwKK1sgIC0td2l0aC1saWItcHJlZml4Wz1ESVJdIHNlYXJjaCBmb3IgbGlicmFyaWVzIGluIERJUi9pbmNsdWRlIGFuZCBESVIvbGliCisgIC0td2l0aG91dC1saWItcHJlZml4ICAgIGRvbid0IHNlYXJjaCBmb3IgbGlicmFyaWVzIGluIGluY2x1ZGVkaXIgYW5kIGxpYmRpcl0sCitbCisgICAgaWYgdGVzdCAiWCR3aXRodmFsIiA9ICJYbm8iOyB0aGVuCisgICAgICB1c2VfYWRkaXRpb25hbD1ubworICAgIGVsc2UKKyAgICAgIGlmIHRlc3QgIlgkd2l0aHZhbCIgPSAiWCI7IHRoZW4KKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFsKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj1cIiRpbmNsdWRlZGlyXCIKKyAgICAgICAgICBldmFsIGFkZGl0aW9uYWxfbGliZGlyPVwiJGxpYmRpclwiCisgICAgICAgIF0pCisgICAgICBlbHNlCisgICAgICAgIGFkZGl0aW9uYWxfaW5jbHVkZWRpcj0iJHdpdGh2YWwvaW5jbHVkZSIKKyAgICAgICAgYWRkaXRpb25hbF9saWJkaXI9IiR3aXRodmFsL2xpYiIKKyAgICAgIGZpCisgICAgZmkKK10pCisgIGlmIHRlc3QgJHVzZV9hZGRpdGlvbmFsID0geWVzOyB0aGVuCisgICAgZG5sIFBvdGVudGlhbGx5IGFkZCAkYWRkaXRpb25hbF9pbmNsdWRlZGlyIHRvICRDUFBGTEFHUy4KKyAgICBkbmwgQnV0IGRvbid0IGFkZCBpdAorICAgIGRubCAgIDEuIGlmIGl0J3MgdGhlIHN0YW5kYXJkIC91c3IvaW5jbHVkZSwKKyAgICBkbmwgICAyLiBpZiBpdCdzIGFscmVhZHkgcHJlc2VudCBpbiAkQ1BQRkxBR1MsCisgICAgZG5sICAgMy4gaWYgaXQncyAvdXNyL2xvY2FsL2luY2x1ZGUgYW5kIHdlIGFyZSB1c2luZyBHQ0Mgb24gTGludXgsCisgICAgZG5sICAgNC4gaWYgaXQgZG9lc24ndCBleGlzdCBhcyBhIGRpcmVjdG9yeS4KKyAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIgIT0gIlgvdXNyL2luY2x1ZGUiOyB0aGVuCisgICAgICBoYXZlaXQ9CisgICAgICBmb3IgeCBpbiAkQ1BQRkxBR1M7IGRvCisgICAgICAgIEFDX0xJQl9XSVRIX0ZJTkFMX1BSRUZJWChbZXZhbCB4PVwiJHhcIl0pCisgICAgICAgIGlmIHRlc3QgIlgkeCIgPSAiWC1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciI7IHRoZW4KKyAgICAgICAgICBoYXZlaXQ9eWVzCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgLXogIiRoYXZlaXQiOyB0aGVuCisgICAgICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9pbmNsdWRlZGlyIiA9ICJYL3Vzci9sb2NhbC9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRHQ0MiOyB0aGVuCisgICAgICAgICAgICBjYXNlICRob3N0X29zIGluCisgICAgICAgICAgICAgIGxpbnV4KikgaGF2ZWl0PXllczs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCAteiAiJGhhdmVpdCI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1kICIkYWRkaXRpb25hbF9pbmNsdWRlZGlyIjsgdGhlbgorICAgICAgICAgICAgZG5sIFJlYWxseSBhZGQgJGFkZGl0aW9uYWxfaW5jbHVkZWRpciB0byAkQ1BQRkxBR1MuCisgICAgICAgICAgICBDUFBGTEFHUz0iJHtDUFBGTEFHU30ke0NQUEZMQUdTOisgfS1JJGFkZGl0aW9uYWxfaW5jbHVkZWRpciIKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICAgIGRubCBQb3RlbnRpYWxseSBhZGQgJGFkZGl0aW9uYWxfbGliZGlyIHRvICRMREZMQUdTLgorICAgIGRubCBCdXQgZG9uJ3QgYWRkIGl0CisgICAgZG5sICAgMS4gaWYgaXQncyB0aGUgc3RhbmRhcmQgL3Vzci9saWIsCisgICAgZG5sICAgMi4gaWYgaXQncyBhbHJlYWR5IHByZXNlbnQgaW4gJExERkxBR1MsCisgICAgZG5sICAgMy4gaWYgaXQncyAvdXNyL2xvY2FsL2xpYiBhbmQgd2UgYXJlIHVzaW5nIEdDQyBvbiBMaW51eCwKKyAgICBkbmwgICA0LiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFzIGEgZGlyZWN0b3J5LgorICAgIGlmIHRlc3QgIlgkYWRkaXRpb25hbF9saWJkaXIiICE9ICJYL3Vzci9saWIiOyB0aGVuCisgICAgICBoYXZlaXQ9CisgICAgICBmb3IgeCBpbiAkTERGTEFHUzsgZG8KKyAgICAgICAgQUNfTElCX1dJVEhfRklOQUxfUFJFRklYKFtldmFsIHg9XCIkeFwiXSkKKyAgICAgICAgaWYgdGVzdCAiWCR4IiA9ICJYLUwkYWRkaXRpb25hbF9saWJkaXIiOyB0aGVuCisgICAgICAgICAgaGF2ZWl0PXllcworICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJYJGFkZGl0aW9uYWxfbGliZGlyIiA9ICJYL3Vzci9sb2NhbC9saWIiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJEdDQyI7IHRoZW4KKyAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgbGludXgqKSBoYXZlaXQ9eWVzOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICBpZiB0ZXN0IC16ICIkaGF2ZWl0IjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgLWQgIiRhZGRpdGlvbmFsX2xpYmRpciI7IHRoZW4KKyAgICAgICAgICAgIGRubCBSZWFsbHkgYWRkICRhZGRpdGlvbmFsX2xpYmRpciB0byAkTERGTEFHUy4KKyAgICAgICAgICAgIExERkxBR1M9IiR7TERGTEFHU30ke0xERkxBR1M6KyB9LUwkYWRkaXRpb25hbF9saWJkaXIiCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK10pCisKK2RubCBBQ19MSUJfUFJFUEFSRV9QUkVGSVggY3JlYXRlcyB2YXJpYWJsZXMgYWNsX2ZpbmFsX3ByZWZpeCwKK2RubCBhY2xfZmluYWxfZXhlY19wcmVmaXgsIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0byB3aGljaCAkcHJlZml4IGFuZAorZG5sICRleGVjX3ByZWZpeCB3aWxsIGV4cGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgorQUNfREVGVU4oW0FDX0xJQl9QUkVQQVJFX1BSRUZJWF0sCitbCisgIGRubCBVbmZvcnR1bmF0ZWx5LCBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGdldCBvbmx5IGZpbmFsbHkgZGV0ZXJtaW5lZAorICBkbmwgYXQgdGhlIGVuZCBvZiBjb25maWd1cmUuCisgIGlmIHRlc3QgIlgkcHJlZml4IiA9ICJYTk9ORSI7IHRoZW4KKyAgICBhY2xfZmluYWxfcHJlZml4PSIkYWNfZGVmYXVsdF9wcmVmaXgiCisgIGVsc2UKKyAgICBhY2xfZmluYWxfcHJlZml4PSIkcHJlZml4IgorICBmaQorICBpZiB0ZXN0ICJYJGV4ZWNfcHJlZml4IiA9ICJYTk9ORSI7IHRoZW4KKyAgICBhY2xfZmluYWxfZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKyAgZWxzZQorICAgIGFjbF9maW5hbF9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBmaQorICBhY2xfc2F2ZV9wcmVmaXg9IiRwcmVmaXgiCisgIHByZWZpeD0iJGFjbF9maW5hbF9wcmVmaXgiCisgIGV2YWwgYWNsX2ZpbmFsX2V4ZWNfcHJlZml4PVwiJGFjbF9maW5hbF9leGVjX3ByZWZpeFwiCisgIHByZWZpeD0iJGFjbF9zYXZlX3ByZWZpeCIKK10pCisKK2RubCBBQ19MSUJfV0lUSF9GSU5BTF9QUkVGSVgoW3N0YXRlbWVudF0pIGV2YWx1YXRlcyBzdGF0ZW1lbnQsIHdpdGggdGhlCitkbmwgdmFyaWFibGVzIHByZWZpeCBhbmQgZXhlY19wcmVmaXggYm91bmQgdG8gdGhlIHZhbHVlcyB0aGV5IHdpbGwgaGF2ZQorZG5sIGF0IHRoZSBlbmQgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCitBQ19ERUZVTihbQUNfTElCX1dJVEhfRklOQUxfUFJFRklYXSwKK1sKKyAgYWNsX3NhdmVfcHJlZml4PSIkcHJlZml4IgorICBwcmVmaXg9IiRhY2xfZmluYWxfcHJlZml4IgorICBhY2xfc2F2ZV9leGVjX3ByZWZpeD0iJGV4ZWNfcHJlZml4IgorICBleGVjX3ByZWZpeD0iJGFjbF9maW5hbF9leGVjX3ByZWZpeCIKKyAgJDEKKyAgZXhlY19wcmVmaXg9IiRhY2xfc2F2ZV9leGVjX3ByZWZpeCIKKyAgcHJlZml4PSIkYWNsX3NhdmVfcHJlZml4IgorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9sb25nZG91YmxlLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L2xvbmdkb3VibGUubTQJMjAwNC0wOS0xMiAxNDo0MDozNC45NDI2NTg4NjQgLTA0MDAKQEAgLTAsMCArMSwzMCBAQAorIyBsb25nZG91YmxlLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KK2RubCBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSAnbG9uZyBkb3VibGUnIHR5cGUuCitkbmwgUHJlcmVxdWlzaXRlOiBBQ19QUk9HX0NDCisKK0FDX0RFRlVOKFtndF9UWVBFX0xPTkdET1VCTEVdLAorWworICBBQ19DQUNIRV9DSEVDSyhbZm9yIGxvbmcgZG91YmxlXSwgZ3RfY3ZfY19sb25nX2RvdWJsZSwKKyAgICBbaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgICBndF9jdl9jX2xvbmdfZG91YmxlPXllcworICAgICBlbHNlCisgICAgICAgQUNfVFJZX0NPTVBJTEUoWworICAgICAgICAgLyogVGhlIFN0YXJkZW50IFZpc3RyYSBrbm93cyBzaXplb2YobG9uZyBkb3VibGUpLCBidXQgZG9lcyBub3Qgc3VwcG9ydCBpdC4gICovCisgICAgICAgICBsb25nIGRvdWJsZSBmb28gPSAwLjA7CisgICAgICAgICAvKiBPbiBVbHRyaXggNC4zIGNjLCBsb25nIGRvdWJsZSBpcyA0IGFuZCBkb3VibGUgaXMgOC4gICovCisgICAgICAgICBpbnQgYXJyYXkgWzIqKHNpemVvZihsb25nIGRvdWJsZSkgPj0gc2l6ZW9mKGRvdWJsZSkpIC0gMV07CisgICAgICAgICBdLCAsCisgICAgICAgICBndF9jdl9jX2xvbmdfZG91YmxlPXllcywgZ3RfY3ZfY19sb25nX2RvdWJsZT1ubykKKyAgICAgZmldKQorICBpZiB0ZXN0ICRndF9jdl9jX2xvbmdfZG91YmxlID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfTE9OR19ET1VCTEUsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdsb25nIGRvdWJsZScgdHlwZS5dKQorICBmaQorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9sb25nbG9uZy5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC9sb25nbG9uZy5tNAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljk0OTY1NzgwMCAtMDQwMApAQCAtMCwwICsxLDI1IEBACisjIGxvbmdsb25nLm00IHNlcmlhbCA0CitkbmwgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorCisjIERlZmluZSBIQVZFX0xPTkdfTE9ORyBpZiAnbG9uZyBsb25nJyB3b3Jrcy4KKworQUNfREVGVU4oW2ptX0FDX1RZUEVfTE9OR19MT05HXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsb25nIGxvbmddLCBhY19jdl90eXBlX2xvbmdfbG9uZywKKyAgW0FDX1RSWV9MSU5LKFtsb25nIGxvbmcgbGwgPSAxTEw7IGludCBpID0gNjM7XSwKKyAgICBbbG9uZyBsb25nIGxsbWF4ID0gKGxvbmcgbG9uZykgLTE7CisgICAgIHJldHVybiBsbCA8PCBpIHwgbGwgPj4gaSB8IGxsbWF4IC8gbGwgfCBsbG1heCAlIGxsO10sCisgICAgYWNfY3ZfdHlwZV9sb25nX2xvbmc9eWVzLAorICAgIGFjX2N2X3R5cGVfbG9uZ19sb25nPW5vKV0pCisgIGlmIHRlc3QgJGFjX2N2X3R5cGVfbG9uZ19sb25nID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfTE9OR19MT05HLCAxLAorICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2xvbmcgbG9uZycgdHlwZS5dKQorICBmaQorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9NYWtlZmlsZS5hbQkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC9NYWtlZmlsZS5hbQkyMDA0LTA5LTEyIDE0OjQwOjM1LjA0ODY0Mjc1MiAtMDQwMApAQCAtMCwwICsxIEBACitFWFRSQV9ESVNUID0gY29kZXNldC5tNCBnZXR0ZXh0Lm00IGdsaWJjMjEubTQgaWNvbnYubTQgaW50ZGl2MC5tNCBpbnRtYXgubTQgaW50dHlwZXMubTQgaW50dHlwZXNfaC5tNCBpbnR0eXBlcy1wcmkubTQgaXNjLXBvc2l4Lm00IGxjbWVzc2FnZS5tNCBsaWItbGQubTQgbGliLWxpbmsubTQgbGliLXByZWZpeC5tNCBsb25nZG91YmxlLm00IGxvbmdsb25nLm00IG5scy5tNCBwby5tNCBwcmludGYtcG9zaXgubTQgcHJvZ3Rlc3QubTQgc2lnbmVkLm00IHNpemVfbWF4Lm00IHN0ZGludF9oLm00IHVpbnRtYXhfdC5tNCB1bG9uZ2xvbmcubTQgd2NoYXJfdC5tNCB3aW50X3QubTQgeHNpemUubTQKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9ubHMubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvbmxzLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTU1NjU2ODg4IC0wNDAwCkBAIC0wLDAgKzEsNDkgQEAKKyMgbmxzLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCitkbmwKK2RubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCitkbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKK2RubCBmdW5jdGlvbmFsaXR5LgorZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKK2RubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKK2RubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KK2RubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KKworZG5sIEF1dGhvcnM6CitkbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS0yMDAwLgorZG5sICAgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LCAyMDAwLTIwMDMuCisKK0FDX0RFRlVOKFtBTV9OTFNdLAorWworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgTkxTIGlzIHJlcXVlc3RlZF0pCisgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCisgIEFDX0FSR19FTkFCTEUobmxzLAorICAgIFsgIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnRdLAorICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCisgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCisgIEFDX1NVQlNUKFVTRV9OTFMpCitdKQorCitBQ19ERUZVTihbQU1fTUtJTlNUQUxMRElSU10sCitbCisgIGRubCBJZiB0aGUgQUNfQ09ORklHX0FVWF9ESVIgbWFjcm8gZm9yIGF1dG9jb25mIGlzIHVzZWQgd2UgcG9zc2libHkKKyAgZG5sIGZpbmQgdGhlIG1raW5zdGFsbGRpcnMgc2NyaXB0IGluIGFub3RoZXIgc3ViZGlyIGJ1dCAkKHRvcF9zcmNkaXIpLgorICBkbmwgVHJ5IHRvIGxvY2F0ZSBpdC4KKyAgTUtJTlNUQUxMRElSUz0KKyAgaWYgdGVzdCAtbiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgICAgY2FzZSAiJGFjX2F1eF9kaXIiIGluCisgICAgICAvKikgTUtJTlNUQUxMRElSUz0iJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICAgICopIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9idWlsZGRpcikvJGFjX2F1eF9kaXIvbWtpbnN0YWxsZGlycyIgOzsKKyAgICBlc2FjCisgIGZpCisgIGlmIHRlc3QgLXogIiRNS0lOU1RBTExESVJTIjsgdGhlbgorICAgIE1LSU5TVEFMTERJUlM9IlwkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMiCisgIGZpCisgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3BvLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L3BvLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTYxNjU1OTc2IC0wNDAwCkBAIC0wLDAgKzEsNDI2IEBACisjIHBvLm00IHNlcmlhbCAzIChnZXR0ZXh0LTAuMTQpCitkbmwgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCitkbmwKK2RubCBUaGlzIGZpbGUgY2FuIGNhbiBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyCitkbmwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworZG5sIExpY2Vuc2UgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQKK2RubCBmdW5jdGlvbmFsaXR5LgorZG5sIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIG9mIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGlzIGNvdmVyZWQKK2RubCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSByZXN0IG9mIHRoZSBHTlUKK2RubCBnZXR0ZXh0IHBhY2thZ2UgcGFja2FnZSBpcyBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KK2RubCBUaGV5IGFyZSAqbm90KiBpbiB0aGUgcHVibGljIGRvbWFpbi4KKworZG5sIEF1dGhvcnM6CitkbmwgICBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS0yMDAwLgorZG5sICAgQnJ1bm8gSGFpYmxlIDxoYWlibGVAY2xpc3AuY29ucy5vcmc+LCAyMDAwLTIwMDMuCisKK2RubCBDaGVja3MgZm9yIGFsbCBwcmVyZXF1aXNpdGVzIG9mIHRoZSBwbyBzdWJkaXJlY3RvcnkuCitBQ19ERUZVTihbQU1fUE9fU1VCRElSU10sCitbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAorICBBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKWRubAorICBBQ19SRVFVSVJFKFtBTV9NS0lOU1RBTExESVJTXSlkbmwKKyAgQUNfUkVRVUlSRShbQU1fTkxTXSlkbmwKKworICBkbmwgUGVyZm9ybSB0aGUgZm9sbG93aW5nIHRlc3RzIGFsc28gaWYgLS1kaXNhYmxlLW5scyBoYXMgYmVlbiBnaXZlbiwKKyAgZG5sIGJlY2F1c2UgdGhleSBhcmUgbmVlZGVkIGZvciAibWFrZSBkaXN0IiB0byB3b3JrLgorCisgIGRubCBTZWFyY2ggZm9yIEdOVSBtc2dmbXQgaW4gdGhlIFBBVEguCisgIGRubCBUaGUgZmlyc3QgdGVzdCBleGNsdWRlcyBTb2xhcmlzIG1zZ2ZtdCBhbmQgZWFybHkgR05VIG1zZ2ZtdCB2ZXJzaW9ucy4KKyAgZG5sIFRoZSBzZWNvbmQgdGVzdCBleGNsdWRlcyBGcmVlQlNEIG1zZ2ZtdC4KKyAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKKyAgICBbJGFjX2Rpci8kYWNfd29yZCAtLXN0YXRpc3RpY3MgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAoaWYgJGFjX2Rpci8kYWNfd29yZCAtLXN0YXRpc3RpY3MgL2Rldi9udWxsIDI+JjEgPi9kZXYvbnVsbCB8IGdyZXAgdXNhZ2UgPi9kZXYvbnVsbDsgdGhlbiBleGl0IDE7IGVsc2UgZXhpdCAwOyBmaSldLAorICAgIDopCisgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQorCisgIGRubCBTZWFyY2ggZm9yIEdOVSB4Z2V0dGV4dCAwLjEyIG9yIG5ld2VyIGluIHRoZSBQQVRILgorICBkbmwgVGhlIGZpcnN0IHRlc3QgZXhjbHVkZXMgU29sYXJpcyB4Z2V0dGV4dCBhbmQgZWFybHkgR05VIHhnZXR0ZXh0IHZlcnNpb25zLgorICBkbmwgVGhlIHNlY29uZCB0ZXN0IGV4Y2x1ZGVzIEZyZWVCU0QgeGdldHRleHQuCisgIEFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAorICAgIFskYWNfZGlyLyRhY193b3JkIC0tb21pdC1oZWFkZXIgLS1jb3B5cmlnaHQtaG9sZGVyPSAtLW1zZ2lkLWJ1Z3MtYWRkcmVzcz0gL2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmJgorICAgICAoaWYgJGFjX2Rpci8kYWNfd29yZCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpXSwKKyAgICA6KQorICBkbmwgUmVtb3ZlIGxlZnRvdmVyIGZyb20gRnJlZUJTRCB4Z2V0dGV4dCBjYWxsLgorICBybSAtZiBtZXNzYWdlcy5wbworCisgIGRubCBTZWFyY2ggZm9yIEdOVSBtc2dtZXJnZSAwLjExIG9yIG5ld2VyIGluIHRoZSBQQVRILgorICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR01FUkdFLCBtc2dtZXJnZSwKKyAgICBbJGFjX2Rpci8kYWNfd29yZCAtLXVwZGF0ZSAtcSAvZGV2L251bGwgL2Rldi9udWxsID4vZGV2L251bGwgMj4mMV0sIDopCisKKyAgZG5sIFRoaXMgY291bGQgZ28gYXdheSBzb21lIGRheTsgdGhlIFBBVEhfUFJPR19XSVRIX1RFU1QgYWxyZWFkeSBkb2VzIGl0LgorICBkbmwgVGVzdCB3aGV0aGVyIHdlIHJlYWxseSBmb3VuZCBHTlUgbXNnZm10LgorICBpZiB0ZXN0ICIkR01TR0ZNVCIgIT0gIjoiOyB0aGVuCisgICAgZG5sIElmIGl0IGlzIG5vIEdOVSBtc2dmbXQgd2UgZGVmaW5lIGl0IGFzIDogc28gdGhhdCB0aGUKKyAgICBkbmwgTWFrZWZpbGVzIHN0aWxsIGNhbiB3b3JrLgorICAgIGlmICRHTVNHRk1UIC0tc3RhdGlzdGljcyAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgKGlmICRHTVNHRk1UIC0tc3RhdGlzdGljcyAvZGV2L251bGwgMj4mMSA+L2Rldi9udWxsIHwgZ3JlcCB1c2FnZSA+L2Rldi9udWxsOyB0aGVuIGV4aXQgMTsgZWxzZSBleGl0IDA7IGZpKTsgdGhlbgorICAgICAgOiA7CisgICAgZWxzZQorICAgICAgR01TR0ZNVD1gZWNobyAiJEdNU0dGTVQiIHwgc2VkIC1lICdzLF4uKi8sLCdgCisgICAgICBBQ19NU0dfUkVTVUxUKAorICAgICAgICBbZm91bmQgJEdNU0dGTVQgcHJvZ3JhbSBpcyBub3QgR05VIG1zZ2ZtdDsgaWdub3JlIGl0XSkKKyAgICAgIEdNU0dGTVQ9IjoiCisgICAgZmkKKyAgZmkKKworICBkbmwgVGhpcyBjb3VsZCBnbyBhd2F5IHNvbWUgZGF5OyB0aGUgUEFUSF9QUk9HX1dJVEhfVEVTVCBhbHJlYWR5IGRvZXMgaXQuCisgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KKyAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KKyAgICBkbmwgSWYgaXQgaXMgbm8gR05VIHhnZXR0ZXh0IHdlIGRlZmluZSBpdCBhcyA6IHNvIHRoYXQgdGhlCisgICAgZG5sIE1ha2VmaWxlcyBzdGlsbCBjYW4gd29yay4KKyAgICBpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAtLWNvcHlyaWdodC1ob2xkZXI9IC0tbXNnaWQtYnVncy1hZGRyZXNzPSAvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgKGlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC0tY29weXJpZ2h0LWhvbGRlcj0gLS1tc2dpZC1idWdzLWFkZHJlc3M9IC9kZXYvbnVsbCAyPiYxID4vZGV2L251bGwgfCBncmVwIHVzYWdlID4vZGV2L251bGw7IHRoZW4gZXhpdCAxOyBlbHNlIGV4aXQgMDsgZmkpOyB0aGVuCisgICAgICA6IDsKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKAorICAgICAgICBbZm91bmQgeGdldHRleHQgcHJvZ3JhbSBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXRdKQorICAgICAgWEdFVFRFWFQ9IjoiCisgICAgZmkKKyAgICBkbmwgUmVtb3ZlIGxlZnRvdmVyIGZyb20gRnJlZUJTRCB4Z2V0dGV4dCBjYWxsLgorICAgIHJtIC1mIG1lc3NhZ2VzLnBvCisgIGZpCisKKyAgQUNfT1VUUFVUX0NPTU1BTkRTKFsKKyAgICBmb3IgYWNfZmlsZSBpbiAkQ09ORklHX0ZJTEVTOyBkbworICAgICAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIgorICAgICAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICAgICAgICo6KikgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICAgICBlc2FjCisgICAgICAjIFBPIGRpcmVjdG9yaWVzIGhhdmUgYSBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi5pbi4KKyAgICAgIGNhc2UgIiRhY19maWxlIiBpbiAqL01ha2VmaWxlLmluKQorICAgICAgICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2Rpci4KKyAgICAgICAgYWNfZGlyPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICAgICAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gIiRhY19kaXIifHNlZCAncyVeXC4vJSUnYCIKKyAgICAgICAgYWNfZG90cz1gZWNobyAiJGFjX2Rpcl9zdWZmaXgifHNlZCAncyUvW14vXSolLi4vJWcnYAorICAgICAgICAjIEluIGF1dG9jb25mLTIuMTMgaXQgaXMgY2FsbGVkICRhY19naXZlbl9zcmNkaXIuCisgICAgICAgICMgSW4gYXV0b2NvbmYtMi41MCBpdCBpcyBjYWxsZWQgJHNyY2Rpci4KKyAgICAgICAgdGVzdCAtbiAiJGFjX2dpdmVuX3NyY2RpciIgfHwgYWNfZ2l2ZW5fc3JjZGlyPSIkc3JjZGlyIgorICAgICAgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAgICAgICAgIC4pICB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2AgOzsKKyAgICAgICAgICAvKikgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgICAgICAgICAqKSAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICAgICAgICBlc2FjCisgICAgICAgIGlmIHRlc3QgLWYgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9QT1RGSUxFUy5pbiI7IHRoZW4KKyAgICAgICAgICBybSAtZiAiJGFjX2Rpci9QT1RGSUxFUyIKKyAgICAgICAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIgfHwgZWNobyAiY3JlYXRpbmcgJGFjX2Rpci9QT1RGSUxFUyIKKyAgICAgICAgICBjYXQgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9QT1RGSUxFUy5pbiIgfCBzZWQgLWUgIi9eIy9kIiAtZSAiL15bIAldKlwkL2QiIC1lICJzLC4qLCAgICAgJHRvcF9zcmNkaXIvJiBcXFxcLCIgfCBzZWQgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iID4gIiRhY19kaXIvUE9URklMRVMiCisgICAgICAgICAgUE9NQUtFRklMRURFUFM9IlBPVEZJTEVTLmluIgorICAgICAgICAgICMgQUxMX0xJTkdVQVMsIFBPRklMRVMsIFVQREFURVBPRklMRVMsIERVTU1ZUE9GSUxFUywgR01PRklMRVMgZGVwZW5kCisgICAgICAgICAgIyBvbiAkYWNfZGlyIGJ1dCBkb24ndCBkZXBlbmQgb24gdXNlci1zcGVjaWZpZWQgY29uZmlndXJhdGlvbgorICAgICAgICAgICMgcGFyYW1ldGVycy4KKyAgICAgICAgICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgICMgVGhlIExJTkdVQVMgZmlsZSBjb250YWlucyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBsYW5ndWFnZXMuCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkT0JTT0xFVEVfQUxMX0xJTkdVQVMiOyB0aGVuCisgICAgICAgICAgICAgIHRlc3QgLW4gIiRhc19tZSIgJiYgZWNobyAiJGFzX21lOiBzZXR0aW5nIEFMTF9MSU5HVUFTIGluIGNvbmZpZ3VyZS5pbiBpcyBvYnNvbGV0ZSIgfHwgZWNobyAic2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgQUxMX0xJTkdVQVNfPWBzZWQgLWUgIi9eIy9kIiAiJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL0xJTkdVQVMiYAorICAgICAgICAgICAgIyBIaWRlIHRoZSBBTExfTElOR1VBUyBhc3NpZ21lbnQgZnJvbSBhdXRvbWFrZS4KKyAgICAgICAgICAgIGV2YWwgJ0FMTF9MSU5HVUFTJyc9JEFMTF9MSU5HVUFTXycKKyAgICAgICAgICAgIFBPTUFLRUZJTEVERVBTPSIkUE9NQUtFRklMRURFUFMgTElOR1VBUyIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIFRoZSBzZXQgb2YgYXZhaWxhYmxlIGxhbmd1YWdlcyB3YXMgZ2l2ZW4gaW4gY29uZmlndXJlLmluLgorICAgICAgICAgICAgZXZhbCAnQUxMX0xJTkdVQVMnJz0kT0JTT0xFVEVfQUxMX0xJTkdVQVMnCisgICAgICAgICAgZmkKKyAgICAgICAgICAjIENvbXB1dGUgUE9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLnBvKQorICAgICAgICAgICMgQ29tcHV0ZSBVUERBVEVQT0ZJTEVTCisgICAgICAgICAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChsYW5nKS5wby11cGRhdGUpCisgICAgICAgICAgIyBDb21wdXRlIERVTU1ZUE9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQobGFuZykubm9wKQorICAgICAgICAgICMgQ29tcHV0ZSBHTU9GSUxFUworICAgICAgICAgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLmdtbykKKyAgICAgICAgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAgICAgICAgICAgLikgc3JjZGlycHJlPSA7OworICAgICAgICAgICAgKikgc3JjZGlycHJlPSckKHNyY2RpcikvJyA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgICBQT0ZJTEVTPQorICAgICAgICAgIFVQREFURVBPRklMRVM9CisgICAgICAgICAgRFVNTVlQT0ZJTEVTPQorICAgICAgICAgIEdNT0ZJTEVTPQorICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICAgICAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5wbyIKKyAgICAgICAgICAgIFVQREFURVBPRklMRVM9IiRVUERBVEVQT0ZJTEVTICRsYW5nLnBvLXVwZGF0ZSIKKyAgICAgICAgICAgIERVTU1ZUE9GSUxFUz0iJERVTU1ZUE9GSUxFUyAkbGFuZy5ub3AiCisgICAgICAgICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRzcmNkaXJwcmUkbGFuZy5nbW8iCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgQ0FUQUxPR1MgZGVwZW5kcyBvbiBib3RoICRhY19kaXIgYW5kIHRoZSB1c2VyJ3MgTElOR1VBUworICAgICAgICAgICMgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICAgICAgSU5TVF9MSU5HVUFTPQorICAgICAgICAgIGlmIHRlc3QgLW4gIiRBTExfTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgIGZvciBwcmVzZW50bGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICAgICAgICAgIHVzZWl0PW5vCisgICAgICAgICAgICAgIGlmIHRlc3QgIiVVTlNFVCUiICE9ICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgICAgICBkZXNpcmVkbGFuZ3VhZ2VzPSIkTElOR1VBUyIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlc2lyZWRsYW5ndWFnZXM9IiRBTExfTElOR1VBUyIKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZm9yIGRlc2lyZWRsYW5nIGluICRkZXNpcmVkbGFuZ3VhZ2VzOyBkbworICAgICAgICAgICAgICAgICMgVXNlIHRoZSBwcmVzZW50bGFuZyBjYXRhbG9nIGlmIGRlc2lyZWRsYW5nIGlzCisgICAgICAgICAgICAgICAgIyAgIGEuIGVxdWFsIHRvIHByZXNlbnRsYW5nLCBvcgorICAgICAgICAgICAgICAgICMgICBiLiBhIHZhcmlhbnQgb2YgcHJlc2VudGxhbmcgKGJlY2F1c2UgaW4gdGhpcyBjYXNlLAorICAgICAgICAgICAgICAgICMgICAgICBwcmVzZW50bGFuZyBjYW4gYmUgdXNlZCBhcyBhIGZhbGxiYWNrIGZvciBtZXNzYWdlcworICAgICAgICAgICAgICAgICMgICAgICB3aGljaCBhcmUgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGRlc2lyZWRsYW5nIGNhdGFsb2cpLgorICAgICAgICAgICAgICAgIGNhc2UgIiRkZXNpcmVkbGFuZyIgaW4KKyAgICAgICAgICAgICAgICAgICIkcHJlc2VudGxhbmciKikgdXNlaXQ9eWVzOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgaWYgdGVzdCAkdXNlaXQgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgICBJTlNUX0xJTkdVQVM9IiRJTlNUX0xJTkdVQVMgJHByZXNlbnRsYW5nIgorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgQ0FUQUxPR1M9CisgICAgICAgICAgaWYgdGVzdCAtbiAiJElOU1RfTElOR1VBUyI7IHRoZW4KKyAgICAgICAgICAgIGZvciBsYW5nIGluICRJTlNUX0xJTkdVQVM7IGRvCisgICAgICAgICAgICAgIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmcuZ21vIgorICAgICAgICAgICAgZG9uZQorICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdCAtbiAiJGFzX21lIiAmJiBlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19kaXIvTWFrZWZpbGUiIHx8IGVjaG8gImNyZWF0aW5nICRhY19kaXIvTWFrZWZpbGUiCisgICAgICAgICAgc2VkIC1lICIvXlBPVEZJTEVTID0vciAkYWNfZGlyL1BPVEZJTEVTIiAtZSAiL14jIE1ha2V2YXJzL3IgJGFjX2dpdmVuX3NyY2Rpci8kYWNfZGlyL01ha2V2YXJzIiAtZSAic3xAUE9GSUxFU0B8JFBPRklMRVN8ZyIgLWUgInN8QFVQREFURVBPRklMRVNAfCRVUERBVEVQT0ZJTEVTfGciIC1lICJzfEBEVU1NWVBPRklMRVNAfCREVU1NWVBPRklMRVN8ZyIgLWUgInN8QEdNT0ZJTEVTQHwkR01PRklMRVN8ZyIgLWUgInN8QENBVEFMT0dTQHwkQ0FUQUxPR1N8ZyIgLWUgInN8QFBPTUFLRUZJTEVERVBTQHwkUE9NQUtFRklMRURFUFN8ZyIgIiRhY19kaXIvTWFrZWZpbGUuaW4iID4gIiRhY19kaXIvTWFrZWZpbGUiCisgICAgICAgICAgZm9yIGYgaW4gIiRhY19naXZlbl9zcmNkaXIvJGFjX2RpciIvUnVsZXMtKjsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRmIjsgdGhlbgorICAgICAgICAgICAgICBjYXNlICIkZiIgaW4KKyAgICAgICAgICAgICAgICAqLm9yaWcgfCAqLmJhayB8ICp+KSA7OworICAgICAgICAgICAgICAgICopIGNhdCAiJGYiID4+ICIkYWNfZGlyL01ha2VmaWxlIiA7OworICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICBkb25lXSwKKyAgIFsjIENhcHR1cmUgdGhlIHZhbHVlIG9mIG9ic29sZXRlIEFMTF9MSU5HVUFTIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBjb21wdXRlCisgICAgIyBQT0ZJTEVTLCBVUERBVEVQT0ZJTEVTLCBEVU1NWVBPRklMRVMsIEdNT0ZJTEVTLCBDQVRBTE9HUy4gQnV0IGhpZGUgaXQKKyAgICAjIGZyb20gYXV0b21ha2UuCisgICAgZXZhbCAnT0JTT0xFVEVfQUxMX0xJTkdVQVMnJz0iJEFMTF9MSU5HVUFTIicKKyAgICAjIENhcHR1cmUgdGhlIHZhbHVlIG9mIExJTkdVQVMgYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGNvbXB1dGUgQ0FUQUxPR1MuCisgICAgTElOR1VBUz0iJHtMSU5HVUFTLSVVTlNFVCV9IgorICAgXSkKK10pCisKK2RubCBQb3N0cHJvY2Vzc2VzIGEgTWFrZWZpbGUgaW4gYSBkaXJlY3RvcnkgY29udGFpbmluZyBQTyBmaWxlcy4KK0FDX0RFRlVOKFtBTV9QT1NUUFJPQ0VTU19QT19NQUtFRklMRV0sCitbCisgICMgV2hlbiB0aGlzIGNvZGUgaXMgcnVuLCBpbiBjb25maWcuc3RhdHVzLCB0d28gdmFyaWFibGVzIGhhdmUgYWxyZWFkeSBiZWVuCisgICMgc2V0OgorICAjIC0gT0JTT0xFVEVfQUxMX0xJTkdVQVMgaXMgdGhlIHZhbHVlIG9mIExJTkdVQVMgc2V0IGluIGNvbmZpZ3VyZS5pbiwKKyAgIyAtIExJTkdVQVMgaXMgdGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBMSU5HVUFTIGF0IGNvbmZpZ3VyZQorICAjICAgdGltZS4KKworY2hhbmdlcXVvdGUoLClkbmwKKyAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIuCisgIGFjX2Rpcj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyUvW14vXVteL10qJCUlJ2AKKyAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICIkYWNfZGlyInxzZWQgJ3MlXlwuLyUlJ2AiCisgIGFjX2RvdHM9YGVjaG8gIiRhY19kaXJfc3VmZml4InxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgIyBJbiBhdXRvY29uZi0yLjEzIGl0IGlzIGNhbGxlZCAkYWNfZ2l2ZW5fc3JjZGlyLgorICAjIEluIGF1dG9jb25mLTIuNTAgaXQgaXMgY2FsbGVkICRzcmNkaXIuCisgIHRlc3QgLW4gIiRhY19naXZlbl9zcmNkaXIiIHx8IGFjX2dpdmVuX3NyY2Rpcj0iJHNyY2RpciIKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgICAuKSAgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgIDs7CisgICAgLyopIHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7CisgICAgKikgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgZXNhYworCisgICMgRmluZCBhIHdheSB0byBlY2hvIHN0cmluZ3Mgd2l0aG91dCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLgorICBpZiB0ZXN0ICJYYChlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAgIGd0X2VjaG89J2VjaG8nCisgIGVsc2UKKyAgICBpZiB0ZXN0ICJYYChwcmludGYgJyVzXG4nICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAgICAgZ3RfZWNobz0ncHJpbnRmICVzXG4nCisgICAgZWxzZQorICAgICAgZWNob19mdW5jICgpIHsKKyAgICAgICAgY2F0IDw8RU9UCiskKgorRU9UCisgICAgICB9CisgICAgICBndF9lY2hvPSdlY2hvX2Z1bmMnCisgICAgZmkKKyAgZmkKKworICAjIEEgc2VkIHNjcmlwdCB0aGF0IGV4dHJhY3RzIHRoZSB2YWx1ZSBvZiBWQVJJQUJMRSBmcm9tIGEgTWFrZWZpbGUuCisgIHNlZF94X3ZhcmlhYmxlPScKKyMgVGVzdCBpZiB0aGUgaG9sZCBzcGFjZSBpcyBlbXB0eS4KK3gKK3MvUC9QLworeAordGEKKyMgWWVzIGl0IHdhcyBlbXB0eS4gTG9vayBpZiB3ZSBoYXZlIHRoZSBleHBlY3RlZCB2YXJpYWJsZSBkZWZpbml0aW9uLgorL15bCSBdKlZBUklBQkxFWwkgXSo9L3sKKyAgIyBTZWVuIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uLgorICBzL15bCSBdKlZBUklBQkxFWwkgXSo9Ly8KKyAgYmEKK30KK2JkCis6YQorIyBIZXJlIHdlIGFyZSBwcm9jZXNzaW5nIGEgbGluZSBmcm9tIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9uLgorIyBSZW1vdmUgY29tbWVudCwgbW9yZSBwcmVjaXNlbHkgcmVwbGFjZSBpdCB3aXRoIGEgc3BhY2UuCitzLyMuKiQvIC8KKyMgU2VlIGlmIHRoZSBsaW5lIGVuZHMgaW4gYSBiYWNrc2xhc2guCit0YgorOmIKK3MvXFwkLy8KKyMgUHJpbnQgdGhlIGxpbmUsIHdpdGhvdXQgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaC4KK3AKK3RjCisjIFRoZXJlIHdhcyBubyB0cmFpbGluZyBiYWNrc2xhc2guIFRoZSBlbmQgb2YgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24gaXMKKyMgcmVhY2hlZC4gQ2xlYXIgdGhlIGhvbGQgc3BhY2UuCitzL14uKiQvLworeAorYmQKKzpjCisjIEEgdHJhaWxpbmcgYmFja3NsYXNoIG1lYW5zIHRoYXQgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24gY29udGludWVzIGluIHRoZQorIyBuZXh0IGxpbmUuIFB1dCBhIG5vbmVtcHR5IHN0cmluZyBpbnRvIHRoZSBob2xkIHNwYWNlIHRvIGluZGljYXRlIHRoaXMuCitzL14uKiQvUC8KK3gKKzpkCisnCitjaGFuZ2VxdW90ZShbLF0pZG5sCisKKyAgIyBTZXQgUE9URklMRVMgdG8gdGhlIHZhbHVlIG9mIHRoZSBNYWtlZmlsZSB2YXJpYWJsZSBQT1RGSUxFUy4KKyAgc2VkX3hfUE9URklMRVM9ImAkZ3RfZWNobyBcIiRzZWRfeF92YXJpYWJsZVwiIHwgc2VkIC1lICcvXiAqIy9kJyAtZSAncy9WQVJJQUJMRS9QT1RGSUxFUy9nJ2AiCisgIFBPVEZJTEVTPWBzZWQgLW4gLWUgIiRzZWRfeF9QT1RGSUxFUyIgPCAiJGFjX2ZpbGUiYAorICAjIENvbXB1dGUgUE9URklMRVNfREVQUyBhcworICAjICAgJChmb3JlYWNoIGZpbGUsICQoUE9URklMRVMpLCAkKHRvcF9zcmNkaXIpLyQoZmlsZSkpCisgIFBPVEZJTEVTX0RFUFM9CisgIGZvciBmaWxlIGluICRQT1RGSUxFUzsgZG8KKyAgICBQT1RGSUxFU19ERVBTPSIkUE9URklMRVNfREVQUyAiJyQodG9wX3NyY2RpcikvJyIkZmlsZSIKKyAgZG9uZQorICBQT01BS0VGSUxFREVQUz0iIgorCisgIGlmIHRlc3QgLW4gIiRPQlNPTEVURV9BTExfTElOR1VBUyI7IHRoZW4KKyAgICB0ZXN0IC1uICIkYXNfbWUiICYmIGVjaG8gIiRhc19tZTogc2V0dGluZyBBTExfTElOR1VBUyBpbiBjb25maWd1cmUuaW4gaXMgb2Jzb2xldGUiIHx8IGVjaG8gInNldHRpbmcgQUxMX0xJTkdVQVMgaW4gY29uZmlndXJlLmluIGlzIG9ic29sZXRlIgorICBmaQorICBpZiB0ZXN0IC1mICIkYWNfZ2l2ZW5fc3JjZGlyLyRhY19kaXIvTElOR1VBUyI7IHRoZW4KKyAgICAjIFRoZSBMSU5HVUFTIGZpbGUgY29udGFpbnMgdGhlIHNldCBvZiBhdmFpbGFibGUgbGFuZ3VhZ2VzLgorICAgIEFMTF9MSU5HVUFTXz1gc2VkIC1lICIvXiMvZCIgIiRhY19naXZlbl9zcmNkaXIvJGFjX2Rpci9MSU5HVUFTImAKKyAgICBQT01BS0VGSUxFREVQUz0iJFBPTUFLRUZJTEVERVBTIExJTkdVQVMiCisgIGVsc2UKKyAgICAjIFNldCBBTExfTElOR1VBUyB0byB0aGUgdmFsdWUgb2YgdGhlIE1ha2VmaWxlIHZhcmlhYmxlIExJTkdVQVMuCisgICAgc2VkX3hfTElOR1VBUz0iYCRndF9lY2hvIFwiJHNlZF94X3ZhcmlhYmxlXCIgfCBzZWQgLWUgJy9eICojL2QnIC1lICdzL1ZBUklBQkxFL0xJTkdVQVMvZydgIgorICAgIEFMTF9MSU5HVUFTXz1gc2VkIC1uIC1lICIkc2VkX3hfTElOR1VBUyIgPCAiJGFjX2ZpbGUiYAorICBmaQorICAjIEhpZGUgdGhlIEFMTF9MSU5HVUFTIGFzc2lnbWVudCBmcm9tIGF1dG9tYWtlLgorICBldmFsICdBTExfTElOR1VBUycnPSRBTExfTElOR1VBU18nCisgICMgQ29tcHV0ZSBQT0ZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLnBvKQorICAjIENvbXB1dGUgVVBEQVRFUE9GSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLnBvLXVwZGF0ZSkKKyAgIyBDb21wdXRlIERVTU1ZUE9GSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKGxhbmcpLm5vcCkKKyAgIyBDb21wdXRlIEdNT0ZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLmdtbykKKyAgIyBDb21wdXRlIFBST1BFUlRJRVNGSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHRvcF9zcmNkaXIpLyQoRE9NQUlOKV8kKGxhbmcpLnByb3BlcnRpZXMpCisgICMgQ29tcHV0ZSBDTEFTU0ZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQodG9wX3NyY2RpcikvJChET01BSU4pXyQobGFuZykuY2xhc3MpCisgICMgQ29tcHV0ZSBRTUZJTEVTCisgICMgYXMgICAgICAkKGZvcmVhY2ggbGFuZywgJChBTExfTElOR1VBUyksICQoc3JjZGlyKS8kKGxhbmcpLnFtKQorICAjIENvbXB1dGUgTVNHRklMRVMKKyAgIyBhcyAgICAgICQoZm9yZWFjaCBsYW5nLCAkKEFMTF9MSU5HVUFTKSwgJChzcmNkaXIpLyQoZnJvYiAkKGxhbmcpKS5tc2cpCisgICMgQ29tcHV0ZSBSRVNPVVJDRVNETExGSUxFUworICAjIGFzICAgICAgJChmb3JlYWNoIGxhbmcsICQoQUxMX0xJTkdVQVMpLCAkKHNyY2RpcikvJChmcm9iICQobGFuZykpLyQoRE9NQUlOKS5yZXNvdXJjZXMuZGxsKQorICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorICAgIC4pIHNyY2RpcnByZT0gOzsKKyAgICAqKSBzcmNkaXJwcmU9JyQoc3JjZGlyKS8nIDs7CisgIGVzYWMKKyAgUE9GSUxFUz0KKyAgVVBEQVRFUE9GSUxFUz0KKyAgRFVNTVlQT0ZJTEVTPQorICBHTU9GSUxFUz0KKyAgUFJPUEVSVElFU0ZJTEVTPQorICBDTEFTU0ZJTEVTPQorICBRTUZJTEVTPQorICBNU0dGSUxFUz0KKyAgUkVTT1VSQ0VTRExMRklMRVM9CisgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KKyAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkc3JjZGlycHJlJGxhbmcucG8iCisgICAgVVBEQVRFUE9GSUxFUz0iJFVQREFURVBPRklMRVMgJGxhbmcucG8tdXBkYXRlIgorICAgIERVTU1ZUE9GSUxFUz0iJERVTU1ZUE9GSUxFUyAkbGFuZy5ub3AiCisgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkc3JjZGlycHJlJGxhbmcuZ21vIgorICAgIFBST1BFUlRJRVNGSUxFUz0iJFBST1BFUlRJRVNGSUxFUyBcJCh0b3Bfc3JjZGlyKS9cJChET01BSU4pXyRsYW5nLnByb3BlcnRpZXMiCisgICAgQ0xBU1NGSUxFUz0iJENMQVNTRklMRVMgXCQodG9wX3NyY2RpcikvXCQoRE9NQUlOKV8kbGFuZy5jbGFzcyIKKyAgICBRTUZJTEVTPSIkUU1GSUxFUyAkc3JjZGlycHJlJGxhbmcucW0iCisgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXC4uKiQvLycgLWUgJ3kvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovJ2AKKyAgICBNU0dGSUxFUz0iJE1TR0ZJTEVTICRzcmNkaXJwcmUkZnJvYmJlZGxhbmcubXNnIgorICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL18vLS9nJ2AKKyAgICBSRVNPVVJDRVNETExGSUxFUz0iJFJFU09VUkNFU0RMTEZJTEVTICRzcmNkaXJwcmUkZnJvYmJlZGxhbmcvXCQoRE9NQUlOKS5yZXNvdXJjZXMuZGxsIgorICBkb25lCisgICMgQ0FUQUxPR1MgZGVwZW5kcyBvbiBib3RoICRhY19kaXIgYW5kIHRoZSB1c2VyJ3MgTElOR1VBUworICAjIGVudmlyb25tZW50IHZhcmlhYmxlLgorICBJTlNUX0xJTkdVQVM9CisgIGlmIHRlc3QgLW4gIiRBTExfTElOR1VBUyI7IHRoZW4KKyAgICBmb3IgcHJlc2VudGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgdXNlaXQ9bm8KKyAgICAgIGlmIHRlc3QgIiVVTlNFVCUiICE9ICIkTElOR1VBUyI7IHRoZW4KKyAgICAgICAgZGVzaXJlZGxhbmd1YWdlcz0iJExJTkdVQVMiCisgICAgICBlbHNlCisgICAgICAgIGRlc2lyZWRsYW5ndWFnZXM9IiRBTExfTElOR1VBUyIKKyAgICAgIGZpCisgICAgICBmb3IgZGVzaXJlZGxhbmcgaW4gJGRlc2lyZWRsYW5ndWFnZXM7IGRvCisgICAgICAgICMgVXNlIHRoZSBwcmVzZW50bGFuZyBjYXRhbG9nIGlmIGRlc2lyZWRsYW5nIGlzCisgICAgICAgICMgICBhLiBlcXVhbCB0byBwcmVzZW50bGFuZywgb3IKKyAgICAgICAgIyAgIGIuIGEgdmFyaWFudCBvZiBwcmVzZW50bGFuZyAoYmVjYXVzZSBpbiB0aGlzIGNhc2UsCisgICAgICAgICMgICAgICBwcmVzZW50bGFuZyBjYW4gYmUgdXNlZCBhcyBhIGZhbGxiYWNrIGZvciBtZXNzYWdlcworICAgICAgICAjICAgICAgd2hpY2ggYXJlIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBkZXNpcmVkbGFuZyBjYXRhbG9nKS4KKyAgICAgICAgY2FzZSAiJGRlc2lyZWRsYW5nIiBpbgorICAgICAgICAgICIkcHJlc2VudGxhbmciKikgdXNlaXQ9eWVzOzsKKyAgICAgICAgZXNhYworICAgICAgZG9uZQorICAgICAgaWYgdGVzdCAkdXNlaXQgPSB5ZXM7IHRoZW4KKyAgICAgICAgSU5TVF9MSU5HVUFTPSIkSU5TVF9MSU5HVUFTICRwcmVzZW50bGFuZyIKKyAgICAgIGZpCisgICAgZG9uZQorICBmaQorICBDQVRBTE9HUz0KKyAgSkFWQUNBVEFMT0dTPQorICBRVENBVEFMT0dTPQorICBUQ0xDQVRBTE9HUz0KKyAgQ1NIQVJQQ0FUQUxPR1M9CisgIGlmIHRlc3QgLW4gIiRJTlNUX0xJTkdVQVMiOyB0aGVuCisgICAgZm9yIGxhbmcgaW4gJElOU1RfTElOR1VBUzsgZG8KKyAgICAgIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmcuZ21vIgorICAgICAgSkFWQUNBVEFMT0dTPSIkSkFWQUNBVEFMT0dTIFwkKERPTUFJTilfJGxhbmcucHJvcGVydGllcyIKKyAgICAgIFFUQ0FUQUxPR1M9IiRRVENBVEFMT0dTICRsYW5nLnFtIgorICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXC4uKiQvLycgLWUgJ3kvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovJ2AKKyAgICAgIFRDTENBVEFMT0dTPSIkVENMQ0FUQUxPR1MgJGZyb2JiZWRsYW5nLm1zZyIKKyAgICAgIGZyb2JiZWRsYW5nPWBlY2hvICRsYW5nIHwgc2VkIC1lICdzL18vLS9nJ2AKKyAgICAgIENTSEFSUENBVEFMT0dTPSIkQ1NIQVJQQ0FUQUxPR1MgJGZyb2JiZWRsYW5nL1wkKERPTUFJTikucmVzb3VyY2VzLmRsbCIKKyAgICBkb25lCisgIGZpCisKKyAgc2VkIC1lICJzfEBQT1RGSUxFU19ERVBTQHwkUE9URklMRVNfREVQU3xnIiAtZSAic3xAUE9GSUxFU0B8JFBPRklMRVN8ZyIgLWUgInN8QFVQREFURVBPRklMRVNAfCRVUERBVEVQT0ZJTEVTfGciIC1lICJzfEBEVU1NWVBPRklMRVNAfCREVU1NWVBPRklMRVN8ZyIgLWUgInN8QEdNT0ZJTEVTQHwkR01PRklMRVN8ZyIgLWUgInN8QFBST1BFUlRJRVNGSUxFU0B8JFBST1BFUlRJRVNGSUxFU3xnIiAtZSAic3xAQ0xBU1NGSUxFU0B8JENMQVNTRklMRVN8ZyIgLWUgInN8QFFNRklMRVNAfCRRTUZJTEVTfGciIC1lICJzfEBNU0dGSUxFU0B8JE1TR0ZJTEVTfGciIC1lICJzfEBSRVNPVVJDRVNETExGSUxFU0B8JFJFU09VUkNFU0RMTEZJTEVTfGciIC1lICJzfEBDQVRBTE9HU0B8JENBVEFMT0dTfGciIC1lICJzfEBKQVZBQ0FUQUxPR1NAfCRKQVZBQ0FUQUxPR1N8ZyIgLWUgInN8QFFUQ0FUQUxPR1NAfCRRVENBVEFMT0dTfGciIC1lICJzfEBUQ0xDQVRBTE9HU0B8JFRDTENBVEFMT0dTfGciIC1lICJzfEBDU0hBUlBDQVRBTE9HU0B8JENTSEFSUENBVEFMT0dTfGciIC1lICdzLF4jZGlzdGRpcjosZGlzdGRpcjosJyA8ICIkYWNfZmlsZSIgPiAiJGFjX2ZpbGUudG1wIgorICBpZiBncmVwIC1sICdAVENMQ0FUQUxPR1NAJyAiJGFjX2ZpbGUiID4gL2Rldi9udWxsOyB0aGVuCisgICAgIyBBZGQgZGVwZW5kZW5jaWVzIHRoYXQgY2Fubm90IGJlIGZvcm11bGF0ZWQgYXMgYSBzaW1wbGUgc3VmZml4IHJ1bGUuCisgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbworICAgICAgZnJvYmJlZGxhbmc9YGVjaG8gJGxhbmcgfCBzZWQgLWUgJ3MvXC4uKiQvLycgLWUgJ3kvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovJ2AKKyAgICAgIGNhdCA+PiAiJGFjX2ZpbGUudG1wIiA8PEVPRgorJGZyb2JiZWRsYW5nLm1zZzogJGxhbmcucG8KKwlAZWNobyAiXCQoTVNHRk1UKSAtYyAtLXRjbCAtZCBcJChzcmNkaXIpIC1sICRsYW5nICRzcmNkaXJwcmUkbGFuZy5wbyI7IFwKKwlcJChNU0dGTVQpIC1jIC0tdGNsIC1kICJcJChzcmNkaXIpIiAtbCAkbGFuZyAkc3JjZGlycHJlJGxhbmcucG8gfHwgeyBybSAtZiAiXCQoc3JjZGlyKS8kZnJvYmJlZGxhbmcubXNnIjsgZXhpdCAxOyB9CitFT0YKKyAgICBkb25lCisgIGZpCisgIGlmIGdyZXAgLWwgJ0BDU0hBUlBDQVRBTE9HU0AnICIkYWNfZmlsZSIgPiAvZGV2L251bGw7IHRoZW4KKyAgICAjIEFkZCBkZXBlbmRlbmNpZXMgdGhhdCBjYW5ub3QgYmUgZm9ybXVsYXRlZCBhcyBhIHNpbXBsZSBzdWZmaXggcnVsZS4KKyAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCisgICAgICBmcm9iYmVkbGFuZz1gZWNobyAkbGFuZyB8IHNlZCAtZSAncy9fLy0vZydgCisgICAgICBjYXQgPj4gIiRhY19maWxlLnRtcCIgPDxFT0YKKyRmcm9iYmVkbGFuZy9cJChET01BSU4pLnJlc291cmNlcy5kbGw6ICRsYW5nLnBvCisJQGVjaG8gIlwkKE1TR0ZNVCkgLWMgLS1jc2hhcnAgLWQgXCQoc3JjZGlyKSAtbCAkbGFuZyAkc3JjZGlycHJlJGxhbmcucG8gLXIgXCQoRE9NQUlOKSI7IFwKKwlcJChNU0dGTVQpIC1jIC0tY3NoYXJwIC1kICJcJChzcmNkaXIpIiAtbCAkbGFuZyAkc3JjZGlycHJlJGxhbmcucG8gLXIgIlwkKERPTUFJTikiIHx8IHsgcm0gLWYgIlwkKHNyY2RpcikvJGZyb2JiZWRsYW5nLm1zZyI7IGV4aXQgMTsgfQorRU9GCisgICAgZG9uZQorICBmaQorICBpZiB0ZXN0IC1uICIkUE9NQUtFRklMRURFUFMiOyB0aGVuCisgICAgY2F0ID4+ICIkYWNfZmlsZS50bXAiIDw8RU9GCitNYWtlZmlsZTogJFBPTUFLRUZJTEVERVBTCitFT0YKKyAgZmkKKyAgbXYgIiRhY19maWxlLnRtcCIgIiRhY19maWxlIgorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9wcmludGYtcG9zaXgubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvcHJpbnRmLXBvc2l4Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTc0NjU0MDAwIC0wNDAwCkBAIC0wLDAgKzEsNDYgQEAKKyMgcHJpbnRmLXBvc2l4Lm00IHNlcmlhbCAyIChnZXR0ZXh0LTAuMTMuMSkKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KK2RubCBUZXN0IHdoZXRoZXIgdGhlIHByaW50ZigpIGZ1bmN0aW9uIHN1cHBvcnRzIFBPU0lYL1hTSSBmb3JtYXQgc3RyaW5ncyB3aXRoCitkbmwgcG9zaXRpb25zLgorCitBQ19ERUZVTihbZ3RfUFJJTlRGX1BPU0lYXSwKK1sKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pCisgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHByaW50ZigpIHN1cHBvcnRzIFBPU0lYL1hTSSBmb3JtYXQgc3RyaW5nc10sCisgICAgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXgsCisgICAgWworICAgICAgQUNfVFJZX1JVTihbCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKy8qIFRoZSBzdHJpbmcgIiUyJGQgJTEkZCIsIHdpdGggZG9sbGFyIGNoYXJhY3RlcnMgcHJvdGVjdGVkIGZyb20gdGhlIHNoZWxsJ3MKKyAgIGRvbGxhciBleHBhbnNpb24gKHBvc3NpYmx5IGFuIGF1dG9jb25mIGJ1ZykuICAqLworc3RhdGljIGNoYXIgZm9ybWF0W10gPSB7ICclJywgJzInLCAnJCcsICdkJywgJyAnLCAnJScsICcxJywgJyQnLCAnZCcsICdcMCcgfTsKK3N0YXRpYyBjaGFyIGJ1ZlsxMDBdOworaW50IG1haW4gKCkKK3sKKyAgc3ByaW50ZiAoYnVmLCBmb3JtYXQsIDMzLCA1NSk7CisgIHJldHVybiAoc3RyY21wIChidWYsICI1NSAzMyIpICE9IDApOworfV0sIGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4PXllcywgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9bm8sCisgICAgICBbCisgICAgICAgIEFDX0VHUkVQX0NQUChub3Rwb3NpeCwgWworI2lmIGRlZmluZWQgX19OZXRCU0RfXyB8fCBkZWZpbmVkIF9NU0NfVkVSIHx8IGRlZmluZWQgX19NSU5HVzMyX18gfHwgZGVmaW5lZCBfX0NZR1dJTl9fCisgIG5vdHBvc2l4CisjZW5kaWYKKyAgICAgICAgXSwgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9Imd1ZXNzaW5nIG5vIiwKKyAgICAgICAgICAgZ3RfY3ZfZnVuY19wcmludGZfcG9zaXg9Imd1ZXNzaW5nIHllcyIpCisgICAgICBdKQorICAgIF0pCisgIGNhc2UgJGd0X2N2X2Z1bmNfcHJpbnRmX3Bvc2l4IGluCisgICAgKnllcykKKyAgICAgIEFDX0RFRklORShIQVZFX1BPU0lYX1BSSU5URiwgMSwKKyAgICAgICAgW0RlZmluZSBpZiB5b3VyIHByaW50ZigpIGZ1bmN0aW9uIHN1cHBvcnRzIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zLl0pCisgICAgICA7OworICBlc2FjCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3Byb2d0ZXN0Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L3Byb2d0ZXN0Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTkwNjUxNTY4IC0wNDAwCkBAIC0wLDAgKzEsOTEgQEAKKyMgcHJvZ3Rlc3QubTQgc2VyaWFsIDMgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KK2RubAorZG5sIFRoaXMgZmlsZSBjYW4gY2FuIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIKK2RubCB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCitkbmwgTGljZW5zZSBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dAorZG5sIGZ1bmN0aW9uYWxpdHkuCitkbmwgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgb2YgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaXMgY292ZXJlZAorZG5sIGJ5IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIEdOVQorZG5sIGdldHRleHQgcGFja2FnZSBwYWNrYWdlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorZG5sIFRoZXkgYXJlICpub3QqIGluIHRoZSBwdWJsaWMgZG9tYWluLgorCitkbmwgQXV0aG9yczoKK2RubCAgIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorCisjIFNlYXJjaCBwYXRoIGZvciBhIHByb2dyYW0gd2hpY2ggcGFzc2VzIHRoZSBnaXZlbiB0ZXN0LgorCitkbmwgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChWQVJJQUJMRSwgUFJPRy1UTy1DSEVDSy1GT1IsCitkbmwgICBURVNULVBFUkZPUk1FRC1PTi1GT1VORF9QUk9HUkFNIFssIFZBTFVFLUlGLU5PVC1GT1VORCBbLCBQQVRIXV0pCitBQ19ERUZVTihbQU1fUEFUSF9QUk9HX1dJVEhfVEVTVF0sCitbCisjIFByZXBhcmUgUEFUSF9TRVBBUkFUT1IuCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisjIEZpbmQgb3V0IGhvdyB0byB0ZXN0IGZvciBleGVjdXRhYmxlIGZpbGVzLiBEb24ndCB1c2UgYSB6ZXJvLWJ5dGUgZmlsZSwKKyMgYXMgc3lzdGVtcyBtYXkgdXNlIG1ldGhvZHMgb3RoZXIgdGhhbiBtb2RlIGJpdHMgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFiaWxpdHkuCitjYXQgPmNvbmYkJC5maWxlIDw8X0FTRU9GCisjISAvYmluL3NoCitleGl0IDAKK19BU0VPRgorY2htb2QgK3ggY29uZiQkLmZpbGUKK2lmIHRlc3QgLXggY29uZiQkLmZpbGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2V4ZWN1dGFibGVfcD0idGVzdCAteCIKK2Vsc2UKKyAgYWNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC1mIgorZmkKK3JtIC1mIGNvbmYkJC5maWxlCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICQyOyBhY193b3JkPVskXTIKK0FDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKK0FDX0NBQ0hFX1ZBTChhY19jdl9wYXRoXyQxLAorW2Nhc2UgIlskXSQxIiBpbgorICBbW1xcL11dKiB8ID86W1tcXC9dXSopCisgICAgYWNfY3ZfcGF0aF8kMT0iWyRdJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICAgIDs7CisgICopCisgICAgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiBpZmVsc2UoWyQ1XSwgLCAkUEFUSCwgWyQ1XSk7IGRvCisgICAgICBJRlM9IiRhY19zYXZlX0lGUyIKKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICAgICAgaWYgJGFjX2V4ZWN1dGFibGVfcCAiJGFjX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgICBpZiBbJDNdOyB0aGVuCisgICAgICAgICAgICBhY19jdl9wYXRoXyQxPSIkYWNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICAgICAgICAgYnJlYWsgMgorICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIElGUz0iJGFjX3NhdmVfSUZTIgorZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKK2RubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgoraWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKK10pZG5sCisgICAgOzsKK2VzYWNdKWRubAorJDE9IiRhY19jdl9wYXRoXyQxIgoraWYgdGVzdCBpZmVsc2UoWyQ0XSwgLCBbLW4gIlskXSQxIl0sIFsiWyRdJDEiICE9ICIkNCJdKTsgdGhlbgorICBBQ19NU0dfUkVTVUxUKFskXSQxKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK0FDX1NVQlNUKCQxKWRubAorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC9zaWduZWQubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvc2lnbmVkLm00CTIwMDQtMDktMTIgMTQ6NDA6MzQuOTk2NjUwNjU2IC0wNDAwCkBAIC0wLDAgKzEsMTkgQEAKKyMgc2lnbmVkLm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTAuNDApCitkbmwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW2JoX0NfU0lHTkVEXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzaWduZWRdLCBiaF9jdl9jX3NpZ25lZCwKKyAgIFtBQ19UUllfQ09NUElMRSgsIFtzaWduZWQgY2hhciB4O10sIGJoX2N2X2Nfc2lnbmVkPXllcywgYmhfY3ZfY19zaWduZWQ9bm8pXSkKKyAgaWYgdGVzdCAkYmhfY3ZfY19zaWduZWQgPSBubzsgdGhlbgorICAgIEFDX0RFRklORShzaWduZWQsICwKKyAgICAgICAgICAgICAgW0RlZmluZSB0byBlbXB0eSBpZiB0aGUgQyBjb21waWxlciBkb2Vzbid0IHN1cHBvcnQgdGhpcyBrZXl3b3JkLl0pCisgIGZpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3NpemVfbWF4Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L3NpemVfbWF4Lm00CTIwMDQtMDktMTIgMTQ6NDA6MzUuMDAzNjQ5NTkyIC0wNDAwCkBAIC0wLDAgKzEsNjEgQEAKKyMgc2l6ZV9tYXgubTQgc2VyaWFsIDIKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KKworQUNfREVGVU4oW2dsX1NJWkVfTUFYXSwKK1sKKyAgQUNfQ0hFQ0tfSEVBREVSUyhzdGRpbnQuaCkKKyAgZG5sIEZpcnN0IHRlc3Qgd2hldGhlciB0aGUgc3lzdGVtIGFscmVhZHkgaGFzIFNJWkVfTUFYLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBTSVpFX01BWF0pCisgIHJlc3VsdD0KKyAgQUNfRUdSRVBfQ1BQKFtGb3VuZCBpdF0sIFsKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBTSVpFX01BWAorRm91bmQgaXQKKyNlbmRpZgorXSwgcmVzdWx0PXllcykKKyAgaWYgdGVzdCAteiAiJHJlc3VsdCI7IHRoZW4KKyAgICBkbmwgRGVmaW5lIGl0IG91cnNlbHZlcy4gSGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgdHlwZSAnc2l6ZV90JyBpcyBub3Qgd2lkZXIKKyAgICBkbmwgdGhhbiB0aGUgdHlwZSAndW5zaWduZWQgbG9uZycuCisgICAgZG5sIFRoZSBfQUNfQ09NUFVURV9JTlQgbWFjcm8gd29ya3MgdXAgdG8gTE9OR19NQVgsIHNpbmNlIGl0IHVzZXMgJ2V4cHInLAorICAgIGRubCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHdvcmsgZnJvbSBMT05HX01JTiB0byBMT05HX01BWC4KKyAgICBfQUNfQ09NUFVURV9JTlQoW34oc2l6ZV90KTAgLyAxMF0sIHJlc19oaSwKKyAgICAgIFsjaW5jbHVkZSA8c3RkZGVmLmg+XSwgcmVzdWx0PT8pCisgICAgX0FDX0NPTVBVVEVfSU5UKFt+KHNpemVfdCkwICUgMTBdLCByZXNfbG8sCisgICAgICBbI2luY2x1ZGUgPHN0ZGRlZi5oPl0sIHJlc3VsdD0/KQorICAgIF9BQ19DT01QVVRFX0lOVChbc2l6ZW9mIChzaXplX3QpIDw9IHNpemVvZiAodW5zaWduZWQgaW50KV0sIGZpdHNfaW5fdWludCwKKyAgICAgIFsjaW5jbHVkZSA8c3RkZGVmLmg+XSwgcmVzdWx0PT8pCisgICAgaWYgdGVzdCAiJGZpdHNfaW5fdWludCIgPSAxOyB0aGVuCisgICAgICBkbmwgRXZlbiB0aG91Z2ggU0laRV9NQVggZml0cyBpbiBhbiB1bnNpZ25lZCBpbnQsIGl0IG11c3QgYmUgb2YgdHlwZQorICAgICAgZG5sICd1bnNpZ25lZCBsb25nJyBpZiB0aGUgdHlwZSAnc2l6ZV90JyBpcyB0aGUgc2FtZSBhcyAndW5zaWduZWQgbG9uZycuCisgICAgICBBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGRlZi5oPgorICAgICAgICBleHRlcm4gc2l6ZV90IGZvbzsKKyAgICAgICAgZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZm9vOworICAgICAgICBdLCBbXSwgZml0c19pbl91aW50PTApCisgICAgZmkKKyAgICBpZiB0ZXN0IC16ICIkcmVzdWx0IjsgdGhlbgorICAgICAgaWYgdGVzdCAiJGZpdHNfaW5fdWludCIgPSAxOyB0aGVuCisgICAgICAgIHJlc3VsdD0iJHJlc19oaSRyZXNfbG8iVQorICAgICAgZWxzZQorICAgICAgICByZXN1bHQ9IiRyZXNfaGkkcmVzX2xvIlVMCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGRubCBTaG91bGRuJ3QgaGFwcGVuLCBidXQgd2hvIGtub3dzLi4uCisgICAgICByZXN1bHQ9J34oc2l6ZV90KTAnCisgICAgZmkKKyAgZmkKKyAgQUNfTVNHX1JFU1VMVChbJHJlc3VsdF0pCisgIGlmIHRlc3QgIiRyZXN1bHQiICE9IHllczsgdGhlbgorICAgIEFDX0RFRklORV9VTlFVT1RFRChbU0laRV9NQVhdLCBbJHJlc3VsdF0sCisgICAgICBbRGVmaW5lIGFzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHR5cGUgJ3NpemVfdCcsIGlmIHRoZSBzeXN0ZW0gZG9lc24ndCBkZWZpbmUgaXQuXSkKKyAgZmkKK10pCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvbTQvc3RkaW50X2gubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvc3RkaW50X2gubTQJMjAwNC0wOS0xMiAxNDo0MDozNS4wMDk2NDg2ODAgLTA0MDAKQEAgLTAsMCArMSwyOCBAQAorIyBzdGRpbnRfaC5tNCBzZXJpYWwgMyAoZ2V0dGV4dC0wLjEyKQorZG5sIENvcHlyaWdodCAoQykgMTk5Ny0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlLCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorZG5sIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbAorZG5sIFB1YmxpYyBMaWNlbnNlLCB0aGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgYSBwcm9ncmFtCitkbmwgdGhhdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgdW5kZXIKK2RubCB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCitkbmwgRnJvbSBQYXVsIEVnZ2VydC4KKworIyBEZWZpbmUgSEFWRV9TVERJTlRfSF9XSVRIX1VJTlRNQVggaWYgPHN0ZGludC5oPiBleGlzdHMsCisjIGRvZXNuJ3QgY2xhc2ggd2l0aCA8c3lzL3R5cGVzLmg+LCBhbmQgZGVjbGFyZXMgdWludG1heF90LgorCitBQ19ERUZVTihbam1fQUNfSEVBREVSX1NURElOVF9IXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzdGRpbnQuaF0sIGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaCwKKyAgW0FDX1RSWV9DT01QSUxFKAorICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+XSwKKyAgICBbdWludG1heF90IGkgPSAodWludG1heF90KSAtMTtdLAorICAgIGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaD15ZXMsCisgICAgam1fYWNfY3ZfaGVhZGVyX3N0ZGludF9oPW5vKV0pCisgIGlmIHRlc3QgJGptX2FjX2N2X2hlYWRlcl9zdGRpbnRfaCA9IHllczsgdGhlbgorICAgIEFDX0RFRklORV9VTlFVT1RFRChIQVZFX1NURElOVF9IX1dJVEhfVUlOVE1BWCwgMSwKKyAgICAgIFtEZWZpbmUgaWYgPHN0ZGludC5oPiBleGlzdHMsIGRvZXNuJ3QgY2xhc2ggd2l0aCA8c3lzL3R5cGVzLmg+LAorICAgICAgIGFuZCBkZWNsYXJlcyB1aW50bWF4X3QuIF0pCisgIGZpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3VpbnRtYXhfdC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC91aW50bWF4X3QubTQJMjAwNC0wOS0xMiAxNDo0MDozNS4wMjE2NDY4NTYgLTA0MDAKQEAgLTAsMCArMSwzMiBAQAorIyB1aW50bWF4X3QubTQgc2VyaWFsIDcgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK2RubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZSwgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKK2RubCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwKK2RubCBQdWJsaWMgTGljZW5zZSwgdGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIGEgcHJvZ3JhbQorZG5sIHRoYXQgY29udGFpbnMgYSBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHVuZGVyCitkbmwgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIGFzIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworZG5sIEZyb20gUGF1bCBFZ2dlcnQuCisKK0FDX1BSRVJFUSgyLjEzKQorCisjIERlZmluZSB1aW50bWF4X3QgdG8gJ3Vuc2lnbmVkIGxvbmcnIG9yICd1bnNpZ25lZCBsb25nIGxvbmcnCisjIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGRlZmluZWQgaW4gPHN0ZGludC5oPiBvciA8aW50dHlwZXMuaD4uCisKK0FDX0RFRlVOKFtqbV9BQ19UWVBFX1VJTlRNQVhfVF0sCitbCisgIEFDX1JFUVVJUkUoW2ptX0FDX0hFQURFUl9JTlRUWVBFU19IXSkKKyAgQUNfUkVRVUlSRShbam1fQUNfSEVBREVSX1NURElOVF9IXSkKKyAgaWYgdGVzdCAkam1fYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSBubyAmJiB0ZXN0ICRqbV9hY19jdl9oZWFkZXJfc3RkaW50X2ggPSBubzsgdGhlbgorICAgIEFDX1JFUVVJUkUoW2ptX0FDX1RZUEVfVU5TSUdORURfTE9OR19MT05HXSkKKyAgICB0ZXN0ICRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZyA9IHllcyBcCisgICAgICAmJiBhY190eXBlPSd1bnNpZ25lZCBsb25nIGxvbmcnIFwKKyAgICAgIHx8IGFjX3R5cGU9J3Vuc2lnbmVkIGxvbmcnCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKHVpbnRtYXhfdCwgJGFjX3R5cGUsCisgICAgICBbRGVmaW5lIHRvIHVuc2lnbmVkIGxvbmcgb3IgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICAgaWYgPHN0ZGludC5oPiBhbmQgPGludHR5cGVzLmg+IGRvbid0IGRlZmluZS5dKQorICBlbHNlCisgICAgQUNfREVGSU5FKEhBVkVfVUlOVE1BWF9ULCAxLAorICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3VpbnRtYXhfdCcgdHlwZSBpbiA8c3RkaW50Lmg+IG9yIDxpbnR0eXBlcy5oPi5dKQorICBmaQorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC91bG9uZ2xvbmcubTQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvbTQvdWxvbmdsb25nLm00CTIwMDQtMDktMTIgMTQ6NDA6MzUuMDI4NjQ1NzkyIC0wNDAwCkBAIC0wLDAgKzEsMjUgQEAKKyMgdWxvbmdsb25nLm00IHNlcmlhbCAzCitkbmwgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIFBhdWwgRWdnZXJ0LgorCisjIERlZmluZSBIQVZFX1VOU0lHTkVEX0xPTkdfTE9ORyBpZiAndW5zaWduZWQgbG9uZyBsb25nJyB3b3Jrcy4KKworQUNfREVGVU4oW2ptX0FDX1RZUEVfVU5TSUdORURfTE9OR19MT05HXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB1bnNpZ25lZCBsb25nIGxvbmddLCBhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZywKKyAgW0FDX1RSWV9MSU5LKFt1bnNpZ25lZCBsb25nIGxvbmcgdWxsID0gMVVMTDsgaW50IGkgPSA2MztdLAorICAgIFt1bnNpZ25lZCBsb25nIGxvbmcgdWxsbWF4ID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgLTE7CisgICAgIHJldHVybiB1bGwgPDwgaSB8IHVsbCA+PiBpIHwgdWxsbWF4IC8gdWxsIHwgdWxsbWF4ICUgdWxsO10sCisgICAgYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmc9eWVzLAorICAgIGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nPW5vKV0pCisgIGlmIHRlc3QgJGFjX2N2X3R5cGVfdW5zaWduZWRfbG9uZ19sb25nID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfVU5TSUdORURfTE9OR19MT05HLCAxLAorICAgICAgW0RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3Vuc2lnbmVkIGxvbmcgbG9uZycgdHlwZS5dKQorICBmaQorXSkKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9tNC93Y2hhcl90Lm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L3djaGFyX3QubTQJMjAwNC0wOS0xMiAxNDo0MDozNS4wMzQ2NDQ4ODAgLTA0MDAKQEAgLTAsMCArMSwyMiBAQAorIyB3Y2hhcl90Lm00IHNlcmlhbCAxIChnZXR0ZXh0LTAuMTIpCitkbmwgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KK2RubCBUZXN0IHdoZXRoZXIgPHN0ZGRlZi5oPiBoYXMgdGhlICd3Y2hhcl90JyB0eXBlLgorZG5sIFByZXJlcXVpc2l0ZTogQUNfUFJPR19DQworCitBQ19ERUZVTihbZ3RfVFlQRV9XQ0hBUl9UXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3Y2hhcl90XSwgZ3RfY3ZfY193Y2hhcl90LAorICAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN0ZGRlZi5oPgorICAgICAgIHdjaGFyX3QgZm9vID0gKHdjaGFyX3QpJ1wwJztdLCAsCisgICAgICAgZ3RfY3ZfY193Y2hhcl90PXllcywgZ3RfY3ZfY193Y2hhcl90PW5vKV0pCisgIGlmIHRlc3QgJGd0X2N2X2Nfd2NoYXJfdCA9IHllczsgdGhlbgorICAgIEFDX0RFRklORShIQVZFX1dDSEFSX1QsIDEsIFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlICd3Y2hhcl90JyB0eXBlLl0pCisgIGZpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3dpbnRfdC5tNAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9tNC93aW50X3QubTQJMjAwNC0wOS0xMiAxNDo0MDozNS4wNDA2NDM5NjggLTA0MDAKQEAgLTAsMCArMSwyMiBAQAorIyB3aW50X3QubTQgc2VyaWFsIDEgKGdldHRleHQtMC4xMikKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2RubCBGcm9tIEJydW5vIEhhaWJsZS4KK2RubCBUZXN0IHdoZXRoZXIgPHdjaGFyLmg+IGhhcyB0aGUgJ3dpbnRfdCcgdHlwZS4KK2RubCBQcmVyZXF1aXNpdGU6IEFDX1BST0dfQ0MKKworQUNfREVGVU4oW2d0X1RZUEVfV0lOVF9UXSwKK1sKKyAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3aW50X3RdLCBndF9jdl9jX3dpbnRfdCwKKyAgICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDx3Y2hhci5oPgorICAgICAgIHdpbnRfdCBmb28gPSAod2NoYXJfdCknXDAnO10sICwKKyAgICAgICBndF9jdl9jX3dpbnRfdD15ZXMsIGd0X2N2X2Nfd2ludF90PW5vKV0pCisgIGlmIHRlc3QgJGd0X2N2X2Nfd2ludF90ID0geWVzOyB0aGVuCisgICAgQUNfREVGSU5FKEhBVkVfV0lOVF9ULCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnd2ludF90JyB0eXBlLl0pCisgIGZpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL200L3hzaXplLm00CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL200L3hzaXplLm00CTIwMDQtMDktMTIgMTQ6NDA6MzUuMDQ3NjQyOTA0IC0wNDAwCkBAIC0wLDAgKzEsMTQgQEAKKyMgeHNpemUubTQgc2VyaWFsIDIKK2RubCBDb3B5cmlnaHQgKEMpIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitkbmwgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmUsIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCitkbmwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsCitkbmwgUHVibGljIExpY2Vuc2UsIHRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiBhIHByb2dyYW0KK2RubCB0aGF0IGNvbnRhaW5zIGEgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlcgorZG5sIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyBhcyB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK0FDX0RFRlVOKFtnbF9YU0laRV0sCitbCisgIGRubCBQcmVyZXF1aXNpdGVzIG9mIGxpYi94c2l6ZS5oLgorICBBQ19SRVFVSVJFKFtnbF9TSVpFX01BWF0pCisgIEFDX0NIRUNLX0hFQURFUlMoc3RkaW50LmgpCitdKQotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL01ha2VmaWxlLmFtCTE5OTgtMTItMzAgMDY6MTk6NDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL01ha2VmaWxlLmFtCTIwMDQtMDktMTIgMTQ6NDA6MzUuMTIxNjMxNjU2IC0wNDAwCkBAIC0xLDUgKzEsNSBAQAogU1VCRElSUyA9IGxpYiBpbnRsIHNyYyBwbyBtYW4gdGVzdHN1aXRlCi1FWFRSQV9ESVNUID0gY2hlY2subHJ6c3ogQ09NUEFUQUJJTElUWSBSRUFETUUuY3ZzIFJFQURNRS5pc2RuNGxpbnV4IFwKK0VYVFJBX0RJU1QgPSBjb25maWcucnBhdGggIGNoZWNrLmxyenN6IENPTVBBVEFCSUxJVFkgUkVBRE1FLmN2cyBSRUFETUUuaXNkbjRsaW51eCBcCiAJUkVBRE1FLmdldHRleHQgcnBtcmMgYnVpbGRycG0gc3lzdHlwZS5pbiBmYXN0Y2hlY2suc2ggUkVBRE1FLnRlc3RzIFwKIAliZW9zLXJ1bnBpcGVkLmMgZmFzdGNoZWNrLmJlb3MKIG5vaW5zdF9TQ1JJUFRTPXN5c3R5cGUKQEAgLTgzLDMgKzgzLDUgQEAKIHJwbTogJChQUikudGFyLmd6IFNwZWNmaWxlCiAJJChzcmNkaXIpL2J1aWxkcnBtICQoc3JjZGlyKQogCisKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00Ci0tLSBscnpzei0wLjEyLjIwLnNhZmUvTWFrZWZpbGUuaW4JMTk5OC0xMi0zMCAxMTozMTo0MC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvTWFrZWZpbGUuaW4JMjAwNC0wOS0xMiAxNDo0MDozNS4xMDk2MzM0ODAgLTA0MDAKQEAgLTEyNSw3ICsxMjUsNyBAQAogCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKIAogJChBQ0xPQ0FMX000KTogIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00Ci0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKKwljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAtSSBtNAogCiBjb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlCiAJJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL21raW5zdGFsbGRpcnMJMTk5OC0wNC0yNiAwOToyMDo1Mi4wMDAwMDAwMDAgLTA0MDAKKysrIGxyenN6LTAuMTIuMjAvbWtpbnN0YWxsZGlycwkyMDA0LTA5LTEyIDE0OjQwOjM0LjMzNzc1MDgyNCAtMDQwMApAQCAtMSwzNCArMSwxNTAgQEAKICMhIC9iaW4vc2gKICMgbWtpbnN0YWxsZGlycyAtLS0gbWFrZSBkaXJlY3RvcnkgaGllcmFyY2h5Ci0jIEF1dGhvcjogTm9haCBGcmllZG1hbiA8ZnJpZWRtYW5AcHJlcC5haS5taXQuZWR1PgorCitzY3JpcHR2ZXJzaW9uPTIwMDQtMDItMTUuMjAKKworIyBPcmlnaW5hbCBhdXRob3I6IE5vYWggRnJpZWRtYW4gPGZyaWVkbWFuQHByZXAuYWkubWl0LmVkdT4KICMgQ3JlYXRlZDogMTk5My0wNS0xNgotIyBMYXN0IG1vZGlmaWVkOiAxOTk1LTAzLTA1Ci0jIFB1YmxpYyBkb21haW4KKyMgUHVibGljIGRvbWFpbi4KKyMKKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKyMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bworIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KIAogZXJyc3RhdHVzPTAKK2Rpcm1vZGU9IiIKIAotZm9yIGZpbGUgaW4gJHsxKyIkQCJ9IDsgZG8KLSAgIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8IHNlZCAtbmUgJ3MvXjpcLy8jLztzL146Ly87cy9cLy8gL2c7cy9eIy9cLy87cCdgCi0gICBzaGlmdAordXNhZ2U9IlwKK1VzYWdlOiBta2luc3RhbGxkaXJzIFstaF0gWy0taGVscF0gWy0tdmVyc2lvbl0gWy1tIE1PREVdIERJUiAuLi4KIAotICAgcGF0aGNvbXA9Ci0gICBmb3IgZCBpbiAkezErIiRAIn0gOyBkbwotICAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCi0gICAgIGNhc2UgIiRwYXRoY29tcCIgaW4KLSAgICAgICAtKiApIHBhdGhjb21wPS4vJHBhdGhjb21wIDs7Ci0gICAgIGVzYWMKK0NyZWF0ZSBlYWNoIGRpcmVjdG9yeSBESVIgKHdpdGggbW9kZSBNT0RFLCBpZiBzcGVjaWZpZWQpLCBpbmNsdWRpbmcgYWxsCitsZWFkaW5nIGZpbGUgbmFtZSBjb21wb25lbnRzLgogCi0gICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgotICAgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiIDE+JjIKLSAgICAgICAgbWtkaXIgIiRwYXRoY29tcCIgPiAvZGV2L251bGwgMj4mMSB8fCBsYXN0ZXJyPSQ/Ci0gICAgIGZpCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKIAotICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KKyMgcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1oIHwgLS1oZWxwIHwgLS1oKikgICAgICAgICAjIC1oIGZvciBoZWxwCisgICAgICBlY2hvICIkdXNhZ2UiCisgICAgICBleGl0IDAKKyAgICAgIDs7CisgICAgLW0pICAgICAgICAgICAgICAgICAgICAgICAgICMgLW0gUEVSTSBhcmcKKyAgICAgIHNoaWZ0CisgICAgICB0ZXN0ICQjIC1lcSAwICYmIHsgZWNobyAiJHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICAgIGRpcm1vZGU9JDEKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgIC0tdmVyc2lvbikKKyAgICAgIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIgorICAgICAgZXhpdCAwCisgICAgICA7OworICAgIC0tKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgIHNoaWZ0CisgICAgICBicmVhaworICAgICAgOzsKKyAgICAtKikgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmtub3duIG9wdGlvbgorICAgICAgZWNobyAiJHVzYWdlIiAxPiYyCisgICAgICBleGl0IDEKKyAgICAgIDs7CisgICAgKikgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmlyc3Qgbm9uLW9wdCBhcmcKKyAgICAgIGJyZWFrCisgICAgICA7OworICBlc2FjCitkb25lCisKK2ZvciBmaWxlCitkbworICBpZiB0ZXN0IC1kICIkZmlsZSI7IHRoZW4KKyAgICBzaGlmdAorICBlbHNlCisgICAgYnJlYWsKKyAgZmkKK2RvbmUKKworY2FzZSAkIyBpbgorICAwKSBleGl0IDAgOzsKK2VzYWMKKworIyBTb2xhcmlzIDgncyBta2RpciAtcCBpc24ndCB0aHJlYWQtc2FmZS4gIElmIHlvdSBta2RpciAtcCBhL2IgYW5kCisjIG1rZGlyIC1wIGEvYyBhdCB0aGUgc2FtZSB0aW1lLCBib3RoIHdpbGwgZGV0ZWN0IHRoYXQgYSBpcyBtaXNzaW5nLAorIyBvbmUgd2lsbCBjcmVhdGUgYSwgdGhlbiB0aGUgb3RoZXIgd2lsbCB0cnkgdG8gY3JlYXRlIGEgYW5kIGRpZSB3aXRoCisjIGEgIkZpbGUgZXhpc3RzIiBlcnJvci4gIFRoaXMgaXMgYSBwcm9ibGVtIHdoZW4gY2FsbGluZyBta2luc3RhbGxkaXJzCisjIGZyb20gYSBwYXJhbGxlbCBtYWtlLiAgV2UgdXNlIC0tdmVyc2lvbiBpbiB0aGUgcHJvYmUgdG8gcmVzdHJpY3QKKyMgb3Vyc2VsdmVzIHRvIEdOVSBta2Rpciwgd2hpY2ggaXMgdGhyZWFkLXNhZmUuCitjYXNlICRkaXJtb2RlIGluCisgICcnKQorICAgIGlmIG1rZGlyIC1wIC0tdmVyc2lvbiAuID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICEgLWQgLi8tLXZlcnNpb247IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyIC1wIC0tICQqIgorICAgICAgZXhlYyBta2RpciAtcCAtLSAiJEAiCisgICAgZWxzZQorICAgICAgIyBPbiBOZXh0U3RlcCBhbmQgT3BlblN0ZXAsIHRoZSBgbWtkaXInIGNvbW1hbmQgZG9lcyBub3QKKyAgICAgICMgcmVjb2duaXplIGFueSBvcHRpb24uICBJdCB3aWxsIGludGVycHJldCBhbGwgb3B0aW9ucyBhcworICAgICAgIyBkaXJlY3RvcmllcyB0byBjcmVhdGUsIGFuZCB0aGVuIGFib3J0IGJlY2F1c2UgYC4nIGFscmVhZHkKKyAgICAgICMgZXhpc3RzLgorICAgICAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKyAgICAgIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KKyAgICBmaQorICAgIDs7CisgICopCisgICAgaWYgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICB0ZXN0ICEgLWQgLi8tLXZlcnNpb247IHRoZW4KKyAgICAgIGVjaG8gIm1rZGlyIC1tICRkaXJtb2RlIC1wIC0tICQqIgorICAgICAgZXhlYyBta2RpciAtbSAiJGRpcm1vZGUiIC1wIC0tICIkQCIKKyAgICBlbHNlCisgICAgICAjIENsZWFuIHVwIGFmdGVyIE5leHRTdGVwIGFuZCBPcGVuU3RlcCBta2Rpci4KKyAgICAgIGZvciBkIGluIC4vLW0gLi8tcCAuLy0tdmVyc2lvbiAiLi8kZGlybW9kZSI7CisgICAgICBkbworICAgICAgICB0ZXN0IC1kICRkICYmIHJtZGlyICRkCisgICAgICBkb25lCisgICAgZmkKKyAgICA7OworZXNhYworCitmb3IgZmlsZQorZG8KKyAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKKyAgc2hpZnQKKworICBwYXRoY29tcD0KKyAgZm9yIGQKKyAgZG8KKyAgICBwYXRoY29tcD0iJHBhdGhjb21wJGQiCisgICAgY2FzZSAkcGF0aGNvbXAgaW4KKyAgICAgIC0qKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIgorCisgICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKyAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgogCWVycnN0YXR1cz0kbGFzdGVycgotICAgICBmaQorICAgICAgZWxzZQorCWlmIHRlc3QgISAteiAiJGRpcm1vZGUiOyB0aGVuCisJICBlY2hvICJjaG1vZCAkZGlybW9kZSAkcGF0aGNvbXAiCisJICBsYXN0ZXJyPSIiCisJICBjaG1vZCAiJGRpcm1vZGUiICIkcGF0aGNvbXAiIHx8IGxhc3RlcnI9JD8KIAotICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKLSAgIGRvbmUKKwkgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCisJICAgIGVycnN0YXR1cz0kbGFzdGVycgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgcGF0aGNvbXA9IiRwYXRoY29tcC8iCisgIGRvbmUKIGRvbmUKIAogZXhpdCAkZXJyc3RhdHVzCisKKyMgTG9jYWwgVmFyaWFibGVzOgorIyBtb2RlOiBzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246IDIKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAic2NyaXB0dmVyc2lvbj0iCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZC4lMDJIIgorIyB0aW1lLXN0YW1wLWVuZDogIiQiCisjIEVuZDoKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9ib2xkcXVvdC5zZWQJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvcG8vYm9sZHF1b3Quc2VkCTIwMDQtMDktMTIgMTQ6NDA6MzQuNzIzNjkyMTUyIC0wNDAwCkBAIC0wLDAgKzEsMTAgQEAKK3MvIlwoW14iXSpcKSIv4oCcXDHigJ0vZworcy9gXChbXmAnXSpcKScv4oCYXDHigJkvZworcy8gJ1woW15gJ10qXCknIC8g4oCYXDHigJkgL2cKK3MvICdcKFteYCddKlwpJyQvIOKAmFwx4oCZL2cKK3MvXidcKFteYCddKlwpJyAv4oCYXDHigJkgL2cKK3Mv4oCc4oCdLyIiL2cKK3Mv4oCcL+KAnBtbMW0vZworcy/igJ0vG1swbeKAnS9nCitzL+KAmC/igJgbWzFtL2cKK3Mv4oCZLxtbMG3igJkvZwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3BvL2NhdC1pZC10YmwuYwkxOTk4LTEyLTI5IDA0OjI0OjI0LjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9wby9jYXQtaWQtdGJsLmMJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKQEAgLTEsMjM0ICswLDAgQEAKLS8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHBvMnRibC5zZWQgZnJvbSBscnpzei5wb3QuICAqLwotCi0jaWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotCi1jb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXSA9IHsKLSAgeyIiLCAxfSwKLSAgeyJpb19tb2RlKCwyKSBpbiByYnNiLmMgbm90IGltcGxlbWVudGVkXG4iLCAyfSwKLSAgeyJjYXVnaHQgc2lnbmFsICVkOyBleGl0aW5nIiwgM30sCi0gIHsiY29tbWFuZCB0cmllcyIsIDR9LAotICB7InBhY2tldGxlbmd0aCIsIDV9LAotICB7InBhY2tldGxlbmd0aCBvdXQgb2YgcmFuZ2UgMjQuLiVsZCIsIDZ9LAotICB7ImZyYW1lbGVuZ3RoIiwgN30sCi0gIHsiZnJhbWVsZW5ndGggb3V0IG9mIHJhbmdlIDMyLi4lbGQiLCA4fSwKLSAgeyJtaW5fYnBzIiwgOX0sCi0gIHsibWluX2JwcyBtdXN0IGJlID49IDAiLCAxMH0sCi0gIHsibWluX2Jwc190aW1lIiwgMTF9LAotICB7Im1pbl9icHNfdGltZSBtdXN0IGJlID4gMSIsIDEyfSwKLSAgeyJob3VyIHRvIGxhcmdlICgwLi4yMykiLCAxM30sCi0gIHsidW5wYXJzYWJsZSBzdG9wIHRpbWVcbiIsIDE0fSwKLSAgeyJtaW51dGUgdG8gbGFyZ2UgKDAuLjU5KSIsIDE1fSwKLSAgeyJzdG9wIHRpbWUgdG8gc21hbGwiLCAxNn0sCi0gIHsic3RvcC1hdCIsIDE3fSwKLSAgeyJ0aW1lb3V0IiwgMTh9LAotICB7InRpbWVvdXQgb3V0IG9mIHJhbmdlIDEwLi4xMDAwIiwgMTl9LAotICB7InNlY3VyaXR5IHZpb2xhdGlvbjogY2FuJ3QgZG8gdGhhdCB1bmRlciByZXN0cmljdGVkIHNoZWxsXG4iLCAyMH0sCi0gIHsid2luZG93IHNpemUiLCAyMX0sCi0gIHsiY2Fubm90IHR1cm5vZmYgc3lzbG9nIiwgMjJ9LAotICB7InN0YXJ0dXAgZGVsYXkiLCAyM30sCi0gIHsib3V0IG9mIG1lbW9yeSIsIDI0fSwKLSAgeyJ0aGlzIHByb2dyYW0gd2FzIG5ldmVyIGludGVuZGVkIHRvIGJlIHVzZWQgc2V0dWlkXG4iLCAyNX0sCi0gIHsibmVlZCBhdCBsZWFzdCBvbmUgZmlsZSB0byBzZW5kIiwgMjZ9LAotICB7IkNhbid0IHNlbmQgY29tbWFuZCBpbiByZXN0cmljdGVkIG1vZGVcbiIsIDI3fSwKLSAgeyJob3N0bmFtZSB0b28gbG9uZ1xuIiwgMjh9LAotICB7ImlsbGVnYWwgc2VydmVyIGFkZHJlc3NcbiIsIDI5fSwKLSAgeyJjYW4gcmVhZCBvbmx5IG9uZSBmaWxlIGZyb20gc3RkaW4iLCAzMH0sCi0gIHsiVHJhbnNmZXIgaW5jb21wbGV0ZVxuIiwgMzF9LAotICB7IlRyYW5zZmVyIGNvbXBsZXRlXG4iLCAzMn0sCi0gIHsic2VuZF9wc2V1ZG8gJXM6IGNhbm5vdCBvcGVuIHRtcGZpbGUgJXM6ICVzIiwgMzN9LAotICB7InNlbmRfcHNldWRvICVzOiBjYW5ub3QgbHN0YXQgdG1wZmlsZSAlczogJXMiLCAzNH0sCi0gIHsic2VuZF9wc2V1ZG8gJXM6IGF2b2lkaW5nIHN5bWxpbmsgdHJhcCIsIDM1fSwKLSAgeyJzZW5kX3BzZXVkbyAlczogY2Fubm90IHdyaXRlIHRvIHRtcGZpbGUgJXM6ICVzIiwgMzZ9LAotICB7InNlbmRfcHNldWRvICVzOiBmYWlsZWQiLCAzN30sCi0gIHsic2VuZF9wc2V1ZG8gJXM6IG9rIiwgMzh9LAotICB7InRjcCBwcm90b2NvbCBpbml0IGZhaWxlZFxuIiwgMzl9LAotICB7IkFuc3dlcmluZyBUSU1FU1lOQyBhdCAlcyIsIDQwfSwKLSAgeyJ0aW1lem9uZSIsIDQxfSwKLSAgeyJ0aW1lem9uZSB1bmtub3duIiwgNDJ9LAotICB7IkNhbid0IG9wZW4gYW55IHJlcXVlc3RlZCBmaWxlcy4iLCA0M30sCi0gIHsic2VjdXJpdHkgdmlvbGF0aW9uOiBub3QgYWxsb3dlZCB0byB1cGxvYWQgZnJvbSAlcyIsIDQ0fSwKLSAgeyJjYW5ub3Qgb3BlbiAlcyIsIDQ1fSwKLSAgeyJpcyBub3QgYSBmaWxlOiAlcyIsIDQ2fSwKLSAgeyIlcy8lczogZXJyb3Igb2NjdXJlZCIsIDQ3fSwKLSAgeyJza2lwcGVkOiAlcyIsIDQ4fSwKLSAgeyIlcy8lczogc2tpcHBlZCIsIDQ5fSwKLSAgeyJCeXRlcyBTZW50OiU3bGQgICBCUFM6JS04bGQgICAgICAgICAgICAgICAgICAgICAgICBcbiIsIDUwfSwKLSAgeyJTZW5kaW5nICVzLCAlbGQgYmxvY2tzOiAiLCA1MX0sCi0gIHsiR2l2ZSB5b3VyIGxvY2FsIFhNT0RFTSByZWNlaXZlIGNvbW1hbmQgbm93LiIsIDUyfSwKLSAgeyJTZW5kaW5nOiAlc1xuIiwgNTN9LAotICB7IlRpbWVvdXQgb24gcGF0aG5hbWUiLCA1NH0sCi0gIHsiUmVjZWl2ZXIgQ2FuY2VsbGVkIiwgNTV9LAotICB7Ik5vIEFDSyBvbiBFT1QiLCA1Nn0sCi0gIHsiWG1vZGVtIHNlY3RvcnMva2J5dGVzIHNlbnQ6ICUzZC8lMmRrIiwgNTd9LAotICB7Illtb2RlbSBzZWN0b3JzL2tieXRlcyBzZW50OiAlM2QvJTJkayIsIDU4fSwKLSAgeyJDYW5jZWxsZWQiLCA1OX0sCi0gIHsiVGltZW91dCBvbiBzZWN0b3IgQUNLIiwgNjB9LAotICB7Ik5BSyBvbiBzZWN0b3IiLCA2MX0sCi0gIHsiR290IGJ1cnN0IGZvciBzZWN0b3IgQUNLIiwgNjJ9LAotICB7IkdvdCAlMDJ4IGZvciBzZWN0b3IgQUNLIiwgNjN9LAotICB7IlJldHJ5IENvdW50IEV4Y2VlZGVkIiwgNjR9LAotICB7IlRyeSBgJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIsIDY1fSwKLSAgeyIlcyB2ZXJzaW9uICVzXG4iLCA2Nn0sCi0gIHsiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlIC4uLlxuIiwgNjd9LAotICB7IiAgIG9yOiAlcyBbb3B0aW9uc10gLXtjfGl9IENPTU1BTkRcbiIsIDY4fSwKLSAgeyJTZW5kIGZpbGUocykgd2l0aCBaTU9ERU0vWU1PREVNL1hNT0RFTSBwcm90b2NvbFxuIiwgNjl9LAotICB7IlwKLSAgICAoWCkgPSBvcHRpb24gYXBwbGllcyB0byBYTU9ERU0gb25seVxuXAotICAgIChZKSA9IG9wdGlvbiBhcHBsaWVzIHRvIFlNT0RFTSBvbmx5XG5cCi0gICAgKFopID0gb3B0aW9uIGFwcGxpZXMgdG8gWk1PREVNIG9ubHlcbiIsIDcwfSwKLSAgeyJcCi0gIC0rLCAtLWFwcGVuZCAgICAgICAgICAgICAgICBhcHBlbmQgdG8gZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZSAoWilcblwKLSAgLTIsIC0tdHdvc3RvcCAgICAgICAgICAgICAgIHVzZSAyIHN0b3AgYml0c1xuXAotICAtNCwgLS10cnktNGsgICAgICAgICAgICAgICAgZ28gdXAgdG8gNEsgYmxvY2tzaXplXG5cCi0gICAgICAtLXN0YXJ0LTRrICAgICAgICAgICAgICBzdGFydCB3aXRoIDRLIGJsb2Nrc2l6ZSAoZG9lc24ndCB0cnkgOClcblwKLSAgLTgsIC0tdHJ5LThrICAgICAgICAgICAgICAgIGdvIHVwIHRvIDhLIGJsb2Nrc2l6ZVxuXAotICAgICAgLS1zdGFydC04ayAgICAgICAgICAgICAgc3RhcnQgd2l0aCA4SyBibG9ja3NpemVcblwKLSAgLWEsIC0tYXNjaWkgICAgICAgICAgICAgICAgIEFTQ0lJIHRyYW5zZmVyIChjaGFuZ2UgQ1IvTEYgdG8gTEYpXG5cCi0gIC1iLCAtLWJpbmFyeSAgICAgICAgICAgICAgICBiaW5hcnkgdHJhbnNmZXJcblwKLSAgLUIsIC0tYnVmc2l6ZSBOICAgICAgICAgICAgIGJ1ZmZlciBOIGJ5dGVzIChOPT1hdXRvOiBidWZmZXIgd2hvbGUgZmlsZSlcblwKLSAgLWMsIC0tY29tbWFuZCBDT01NQU5EICAgICAgIGV4ZWN1dGUgcmVtb3RlIGNvbW1hbmQgQ09NTUFORCAoWilcblwKLSAgLUMsIC0tY29tbWFuZC10cmllcyBOICAgICAgIHRyeSBOIHRpbWVzIHRvIGV4ZWN1dGUgYSBjb21tYW5kIChaKVxuXAotICAtZCwgLS1kb3QtdG8tc2xhc2ggICAgICAgICAgY2hhbmdlICcuJyB0byAnLycgaW4gcGF0aG5hbWVzIChZL1opXG5cCi0gICAgICAtLWRlbGF5LXN0YXJ0dXAgTiAgICAgICBzbGVlcCBOIHNlY29uZHMgYmVmb3JlIGRvaW5nIGFueXRoaW5nXG5cCi0gIC1lLCAtLWVzY2FwZSAgICAgICAgICAgICAgICBlc2NhcGUgYWxsIGNvbnRyb2wgY2hhcmFjdGVycyAoWilcblwKLSAgLUUsIC0tcmVuYW1lICAgICAgICAgICAgICAgIGZvcmNlIHJlY2VpdmVyIHRvIHJlbmFtZSBmaWxlcyBpdCBhbHJlYWR5IGhhc1xuXAotICAtZiwgLS1mdWxsLXBhdGggICAgICAgICAgICAgc2VuZCBmdWxsIHBhdGhuYW1lIChZL1opXG5cCi0gIC1pLCAtLWltbWVkaWF0ZS1jb21tYW5kIENNRCBzZW5kIHJlbW90ZSBDTUQsIHJldHVybiBpbW1lZGlhdGVseSAoWilcblwKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgdXNhZ2UgbWVzc2FnZVxuXAotICAtaywgLS0xayAgICAgICAgICAgICAgICAgICAgc2VuZCAxMDI0IGJ5dGUgcGFja2V0cyAoWClcblwKLSAgLUwsIC0tcGFja2V0bGVuIE4gICAgICAgICAgIGxpbWl0IHN1YnBhY2tldCBsZW5ndGggdG8gTiBieXRlcyAoWilcblwKLSAgLWwsIC0tZnJhbWVsZW4gTiAgICAgICAgICAgIGxpbWl0IGZyYW1lIGxlbmd0aCB0byBOIGJ5dGVzIChsPj1MKSAoWilcblwKLSAgLW0sIC0tbWluLWJwcyBOICAgICAgICAgICAgIHN0b3AgdHJhbnNtaXNzaW9uIGlmIEJQUyBiZWxvdyBOXG5cCi0gIC1NLCAtLW1pbi1icHMtdGltZSBOICAgICAgICAgIGZvciBhdCBsZWFzdCBOIHNlY29uZHMgKGRlZmF1bHQ6IDEyMClcbiIsIDcxfSwKLSAgeyJcCi0gIC1uLCAtLW5ld2VyICAgICAgICAgICAgICAgICBzZW5kIGZpbGUgaWYgc291cmNlIG5ld2VyIChaKVxuXAotICAtTiwgLS1uZXdlci1vci1sb25nZXIgICAgICAgc2VuZCBmaWxlIGlmIHNvdXJjZSBuZXdlciBvciBsb25nZXIgKFopXG5cCi0gIC1vLCAtLTE2LWJpdC1jcmMgICAgICAgICAgICB1c2UgMTYgYml0IENSQyBpbnN0ZWFkIG9mIDMyIGJpdCBDUkMgKFopXG5cCi0gIC1PLCAtLWRpc2FibGUtdGltZW91dHMgICAgICBkaXNhYmxlIHRpbWVvdXQgY29kZSwgd2FpdCBmb3JldmVyXG5cCi0gIC1wLCAtLXByb3RlY3QgICAgICAgICAgICAgICBwcm90ZWN0IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUgKFopXG5cCi0gIC1yLCAtLXJlc3VtZSAgICAgICAgICAgICAgICByZXN1bWUgaW50ZXJydXB0ZWQgZmlsZSB0cmFuc2ZlciAoWilcblwKLSAgLVIsIC0tcmVzdHJpY3RlZCAgICAgICAgICAgIHJlc3RyaWN0ZWQsIG1vcmUgc2VjdXJlIG1vZGVcblwKLSAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgIHF1aWV0IChubyBwcm9ncmVzcyByZXBvcnRzKVxuXAotICAtcywgLS1zdG9wLWF0IHtISDpNTXwrTn0gICAgc3RvcCB0cmFuc21pc3Npb24gYXQgSEg6TU0gb3IgaW4gTiBzZWNvbmRzXG5cCi0gICAgICAtLXRjcCAgICAgICAgICAgICAgICAgICBidWlsZCBhIFRDUCBjb25uZWN0aW9uIHRvIHRyYW5zbWl0IGZpbGVzXG5cCi0gICAgICAtLXRjcC1zZXJ2ZXIgICAgICAgICAgICBvcGVuIHNvY2tldCwgd2FpdCBmb3IgY29ubmVjdGlvblxuXAotICAtdSwgLS11bmxpbmsgICAgICAgICAgICAgICAgdW5saW5rIGZpbGUgYWZ0ZXIgdHJhbnNtaXNzaW9uXG5cCi0gIC1VLCAtLXVucmVzdHJpY3QgICAgICAgICAgICB0dXJuIG9mZiByZXN0cmljdGVkIG1vZGUgKGlmIGFsbG93ZWQgdG8pXG5cCi0gIC12LCAtLXZlcmJvc2UgICAgICAgICAgICAgICBiZSB2ZXJib3NlLCBwcm92aWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuXAotICAtdywgLS13aW5kb3dzaXplIE4gICAgICAgICAgV2luZG93IGlzIE4gYnl0ZXMgKFopXG5cCi0gIC1YLCAtLXhtb2RlbSAgICAgICAgICAgICAgICB1c2UgWE1PREVNIHByb3RvY29sXG5cCi0gIC15LCAtLW92ZXJ3cml0ZSAgICAgICAgICAgICBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXNcblwKLSAgLVksIC0tb3ZlcndyaXRlLW9yLXNraXAgICAgIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcywgZWxzZSBza2lwXG5cCi0gICAgICAtLXltb2RlbSAgICAgICAgICAgICAgICB1c2UgWU1PREVNIHByb3RvY29sXG5cCi0gIC1aLCAtLXptb2RlbSAgICAgICAgICAgICAgICB1c2UgWk1PREVNIHByb3RvY29sXG5cCi1cblwKLXNob3J0IG9wdGlvbnMgdXNlIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgbG9uZyBvbmVzXG4iLCA3Mn0sCi0gIHsiZ290IFpSUUlOSVQiLCA3M30sCi0gIHsiZ290IFpDQU4iLCA3NH0sCi0gIHsiYmxrbGVuIG5vdyAlZFxuIiwgNzV9LAotICB7InpzZW5kZmRhdGE6IGJwcyByYXRlICVsZCBiZWxvdyBtaW4gJWxkIiwgNzZ9LAotICB7InpzZW5kZmRhdGE6IHJlYWNoZWQgc3RvcCB0aW1lIiwgNzd9LAotICB7IkJ5dGVzIFNlbnQ6JTdsZC8lN2xkICAgQlBTOiUtOGxkIEVUQSAlMDJkOiUwMmQgICIsIDc4fSwKLSAgeyJjYWxjX2Jsa2xlbjogcmVkdWNlZCB0byAlZCBkdWUgdG8gZXJyb3JcbiIsIDc5fSwKLSAgeyJjYWxjX2Jsa2xlbjogcmV0dXJuZWQgb2xkIHZhbHVlICVkIGR1ZSB0byBsb3cgYnBlIGRpZmZcbiIsIDgwfSwKLSAgeyJjYWxjX2Jsa2xlbjogb2xkICVsZCwgbmV3ICVsZCwgZCAlbGRcbiIsIDgxfSwKLSAgeyJjYWxjX2Jsa2xlbjogY2FsYyB0b3RhbF9ieXRlcz0lbGQsIGJwZT0lbGQsIGVjPSVsZFxuIiwgODJ9LAotICB7ImNhbGNfYmxrbGVuOiBibGtsZW4gJWQsIG9rICVsZCwgZmFpbGVkICVsZCAtPiAlbHVcbiIsIDgzfSwKLSAgeyJjYWxjX2Jsa2xlbjogcmV0dXJuZWQgJWQgYXMgYmVzdFxuIiwgODR9LAotICB7IlwKLVxuXAotY291bnRlbTogVG90YWwgJWQgJWxkXG4iLCA4NX0sCi0gIHsiQmFkIGVzY2FwZSBzZXF1ZW5jZSAleCIsIDg2fSwKLSAgeyJTZW5kZXIgQ2FuY2VsZWQiLCA4N30sCi0gIHsiVElNRU9VVCIsIDg4fSwKLSAgeyJCYWQgZGF0YSBzdWJwYWNrZXQiLCA4OX0sCi0gIHsiRGF0YSBzdWJwYWNrZXQgdG9vIGxvbmciLCA5MH0sCi0gIHsiR2FyYmFnZSBjb3VudCBleGNlZWRlZCIsIDkxfSwKLSAgeyJHb3QgJXMiLCA5Mn0sCi0gIHsiUmV0cnkgJWQ6ICIsIDkzfSwKLSAgeyJkb24ndCBoYXZlIHNldHRpbWVvZmRheSwgd2lsbCBub3Qgc2V0IHRpbWVcbiIsIDk0fSwKLSAgeyJub3QgcnVubmluZyBhcyByb290ICh0aGlzIGlzIGdvb2QhKSwgY2FuIG5vdCBzZXQgdGltZVxuIiwgOTV9LAotICB7ImJ5dGVzX3Blcl9lcnJvciIsIDk2fSwKLSAgeyJieXRlcy1wZXItZXJyb3Igc2hvdWxkIGJlID4xMDAiLCA5N30sCi0gIHsiT19TWU5DIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCIsIDk4fSwKLSAgeyJnYXJiYWdlIG9uIGNvbW1hbmRsaW5lIiwgOTl9LAotICB7IlVzYWdlOiAlcyBbb3B0aW9uc10gW2ZpbGVuYW1lLmlmLnhtb2RlbV1cbiIsIDEwMH0sCi0gIHsiUmVjZWl2ZSBmaWxlcyB3aXRoIFpNT0RFTS9ZTU9ERU0vWE1PREVNIHByb3RvY29sXG4iLCAxMDF9LAotICB7IlwKLSAgLSssIC0tYXBwZW5kICAgICAgICAgICAgICAgIGFwcGVuZCB0byBleGlzdGluZyBmaWxlc1xuXAotICAtYSwgLS1hc2NpaSAgICAgICAgICAgICAgICAgQVNDSUkgdHJhbnNmZXIgKGNoYW5nZSBDUi9MRiB0byBMRilcblwKLSAgLWIsIC0tYmluYXJ5ICAgICAgICAgICAgICAgIGJpbmFyeSB0cmFuc2ZlclxuXAotICAtQiwgLS1idWZzaXplIE4gICAgICAgICAgICAgYnVmZmVyIE4gYnl0ZXMgKE49PWF1dG86IGJ1ZmZlciB3aG9sZSBmaWxlKVxuXAotICAtYywgLS13aXRoLWNyYyAgICAgICAgICAgICAgVXNlIDE2IGJpdCBDUkMgKFgpXG5cCi0gIC1DLCAtLWFsbG93LXJlbW90ZS1jb21tYW5kcyBhbGxvdyBleGVjdXRpb24gb2YgcmVtb3RlIGNvbW1hbmRzIChaKVxuXAotICAtRCwgLS1udWxsICAgICAgICAgICAgICAgICAgd3JpdGUgYWxsIHJlY2VpdmVkIGRhdGEgdG8gL2Rldi9udWxsXG5cCi0gICAgICAtLWRlbGF5LXN0YXJ0dXAgTiAgICAgICBzbGVlcCBOIHNlY29uZHMgYmVmb3JlIGRvaW5nIGFueXRoaW5nXG5cCi0gIC1lLCAtLWVzY2FwZSAgICAgICAgICAgICAgICBFc2NhcGUgY29udHJvbCBjaGFyYWN0ZXJzIChaKVxuXAotICAtRSwgLS1yZW5hbWUgICAgICAgICAgICAgICAgcmVuYW1lIGFueSBmaWxlcyBhbHJlYWR5IGV4aXN0aW5nXG5cCi0gICAgICAtLWVycm9ycyBOICAgICAgICAgICAgICBnZW5lcmF0ZSBDUkMgZXJyb3IgZXZlcnkgTiBieXRlcyAoZGVidWdnaW5nKVxuXAotICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgICAgSGVscCwgcHJpbnQgdGhpcyB1c2FnZSBtZXNzYWdlXG5cCi0gIC1tLCAtLW1pbi1icHMgTiAgICAgICAgICAgICBzdG9wIHRyYW5zbWlzc2lvbiBpZiBCUFMgYmVsb3cgTlxuXAotICAtTSwgLS1taW4tYnBzLXRpbWUgTiAgICAgICAgICBmb3IgYXQgbGVhc3QgTiBzZWNvbmRzIChkZWZhdWx0OiAxMjApXG5cCi0gIC1PLCAtLWRpc2FibGUtdGltZW91dHMgICAgICBkaXNhYmxlIHRpbWVvdXQgY29kZSwgd2FpdCBmb3JldmVyIGZvciBkYXRhXG5cCi0gICAgICAtLW8tc3luYyAgICAgICAgICAgICAgICBvcGVuIG91dHB1dCBmaWxlKHMpIGluIHN5bmNocm9ub3VzIHdyaXRlIG1vZGVcblwKLSAgLXAsIC0tcHJvdGVjdCAgICAgICAgICAgICAgIHByb3RlY3QgZXhpc3RpbmcgZmlsZXNcblwKLSAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgIHF1aWV0LCBubyBwcm9ncmVzcyByZXBvcnRzXG5cCi0gIC1yLCAtLXJlc3VtZSAgICAgICAgICAgICAgICB0cnkgdG8gcmVzdW1lIGludGVycnVwdGVkIGZpbGUgdHJhbnNmZXIgKFopXG5cCi0gIC1SLCAtLXJlc3RyaWN0ZWQgICAgICAgICAgICByZXN0cmljdGVkLCBtb3JlIHNlY3VyZSBtb2RlXG5cCi0gIC1zLCAtLXN0b3AtYXQge0hIOk1NfCtOfSAgICBzdG9wIHRyYW5zbWlzc2lvbiBhdCBISDpNTSBvciBpbiBOIHNlY29uZHNcblwKLSAgLVMsIC0tdGltZXN5bmMgICAgICAgICAgICAgIHJlcXVlc3QgcmVtb3RlIHRpbWUgKHR3aWNlOiBzZXQgbG9jYWwgdGltZSlcblwKLSAgICAgIC0tc3lzbG9nWz1vZmZdICAgICAgICAgIHR1cm4gc3lzbG9nIG9uIG9yIG9mZiwgaWYgcG9zc2libGVcblwKLSAgLXQsIC0tdGltZW91dCBOICAgICAgICAgICAgIHNldCB0aW1lb3V0IHRvIE4gdGVudGhzIG9mIGEgc2Vjb25kXG5cCi0gIC11LCAtLWtlZXAtdXBwZXJjYXNlICAgICAgICBrZWVwIHVwcGVyIGNhc2UgZmlsZW5hbWVzXG5cCi0gIC1VLCAtLXVucmVzdHJpY3QgICAgICAgICAgICBkaXNhYmxlIHJlc3RyaWN0ZWQgbW9kZSAoaWYgYWxsb3dlZCB0bylcblwKLSAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgICAgIGJlIHZlcmJvc2UsIHByb3ZpZGUgZGVidWdnaW5nIGluZm9ybWF0aW9uXG5cCi0gIC13LCAtLXdpbmRvd3NpemUgTiAgICAgICAgICBXaW5kb3cgaXMgTiBieXRlcyAoWilcblwKLSAgLVggIC0teG1vZGVtICAgICAgICAgICAgICAgIHVzZSBYTU9ERU0gcHJvdG9jb2xcblwKLSAgLXksIC0tb3ZlcndyaXRlICAgICAgICAgICAgIFllcywgY2xvYmJlciBleGlzdGluZyBmaWxlIGlmIGFueVxuXAotICAgICAgLS15bW9kZW0gICAgICAgICAgICAgICAgdXNlIFlNT0RFTSBwcm90b2NvbFxuXAotICAtWiwgLS16bW9kZW0gICAgICAgICAgICAgICAgdXNlIFpNT0RFTSBwcm90b2NvbFxuXAotXG5cCi1zaG9ydCBvcHRpb25zIHVzZSB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlIGxvbmcgb25lc1xuIiwgMTAyfSwKLSAgeyIlcyB3YWl0aW5nIHRvIHJlY2VpdmUuIiwgMTAzfSwKLSAgeyJcckJ5dGVzIHJlY2VpdmVkOiAlN2xkLyU3bGQgICBCUFM6JS02bGQgICAgICAgICAgICAgICAgXHJcbiIsIDEwNH0sCi0gIHsiJXM6IHJlYWR5IHRvIHJlY2VpdmUgJXMiLCAxMDV9LAotICB7IlxyQnl0ZXMgcmVjZWl2ZWQ6ICU3bGQgICBCUFM6JS02bGQgICAgICAgICAgICAgICAgXHJcbiIsIDEwNn0sCi0gIHsiXAotXHJcblwKLSVzOiAlcyByZW1vdmVkLlxyXG4iLCAxMDd9LAotICB7IlBhdGhuYW1lIGZldGNoIHJldHVybmVkIEVPVCIsIDEwOH0sCi0gIHsiUmVjZWl2ZWQgZHVwIFNlY3RvciIsIDEwOX0sCi0gIHsiU3luYyBFcnJvciIsIDExMH0sCi0gIHsiQ1JDIiwgMTExfSwKLSAgeyJDaGVja3N1bSIsIDExMn0sCi0gIHsiU2VjdG9yIG51bWJlciBnYXJibGVkIiwgMTEzfSwKLSAgeyJTZW5kZXIgQ2FuY2VsbGVkIiwgMTE0fSwKLSAgeyJHb3QgMCVvIHNlY3RvciBoZWFkZXIiLCAxMTV9LAotICB7ImZpbGUgbmFtZSBlbmRzIHdpdGggYSAvLCBza2lwcGVkOiAlc1xuIiwgMTE2fSwKLSAgeyJ6bWFuYWc9JWQsIEx6bWFuYWc9JWRcbiIsIDExN30sCi0gIHsiemNvbnY9JWRcbiIsIDExOH0sCi0gIHsiZmlsZSBleGlzdHMsIHNraXBwZWQ6ICVzXG4iLCAxMTl9LAotICB7IlRJTUVTWU5DOiBoZXJlICVsZCwgcmVtb3RlICVsZCwgZGlmZiAlbGQgc2Vjb25kc1xuIiwgMTIwfSwKLSAgeyJUSU1FU1lOQzogY2Fubm90IHNldCB0aW1lOiAlc1xuIiwgMTIxfSwKLSAgeyJjYW5ub3QgdG1wZmlsZSgpIGZvciB0Y3AgcHJvdG9jb2wgc3luY2hyb25pemF0aW9uIiwgMTIyfSwKLSAgeyJUb3BpcGUiLCAxMjN9LAotICB7IlJlY2VpdmluZzogJXNcbiIsIDEyNH0sCi0gIHsiQmxvY2tzIHJlY2VpdmVkOiAlZCIsIDEyNX0sCi0gIHsiJXM6ICVzIGV4aXN0c1xuIiwgMTI2fSwKLSAgeyIlczpcdFNlY3VyaXR5IFZpb2xhdGlvbiIsIDEyN30sCi0gIHsicmVtb3RlIGNvbW1hbmQgZXhlY3V0aW9uIHJlcXVlc3RlZCIsIDEyOH0sCi0gIHsibm90IGV4ZWN1dGVkIiwgMTI5fSwKLSAgeyJnb3QgWlJJTklUIiwgMTMwfSwKLSAgeyJTa2lwcGVkIiwgMTMxfSwKLSAgeyJyemZpbGU6IGJwcyByYXRlICVsZCBiZWxvdyBtaW4gJWxkIiwgMTMyfSwKLSAgeyJyemZpbGU6IHJlYWNoZWQgc3RvcCB0aW1lIiwgMTMzfSwKLSAgeyJcckJ5dGVzIHJlY2VpdmVkOiAlN2xkLyU3bGQgICBCUFM6JS02bGQgRVRBICUwMmQ6JTAyZCAgIiwgMTM0fSwKLSAgeyJmZ2V0cyBmb3IgdGNwIHByb3RvY29sIHN5bmNocm9uaXphdGlvbiBmYWlsZWQ6ICIsIDEzNX0sCi0gIHsiZmlsZSBjbG9zZSBlcnJvciIsIDEzNn0sCi19OwotCi1pbnQgX21zZ190YmxfbGVuZ3RoID0gMTM2OwotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3BvL0NoYW5nZUxvZwkxOTk4LTA0LTI2IDA5OjIwOjUyLjAwMDAwMDAwMCAtMDQwMAorKysgbHJ6c3otMC4xMi4yMC9wby9DaGFuZ2VMb2cJMjAwNC0wOS0xMiAxNDo0MDozNC43OTM2ODE1MTIgLTA0MDAKQEAgLTEsMyArMSwxNSBAQAorMjAwNC0wOS0xMiAgZ2V0dGV4dGl6ZSAgPGJ1Zy1nbnUtZ2V0dGV4dEBnbnUub3JnPgorCisJKiBib2xkcXVvdC5zZWQ6IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogZW5AYm9sZHF1b3QuaGVhZGVyOiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIGVuQHF1b3QuaGVhZGVyOiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIGluc2VydC1oZWFkZXIuc2luOiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIHF1b3Quc2VkOiBOZXcgZmlsZSwgZnJvbSBnZXR0ZXh0LTAuMTQuMS4KKwkqIHJlbW92ZS1wb3RjZGF0ZS5zaW46IE5ldyBmaWxlLCBmcm9tIGdldHRleHQtMC4xNC4xLgorCSogUnVsZXMtcXVvdDogTmV3IGZpbGUsIGZyb20gZ2V0dGV4dC0wLjE0LjEuCisJKiBjYXQtaWQtdGJsLmM6IFJlbW92ZSBmaWxlLgorCSogc3RhbXAtY2F0LWlkOiBSZW1vdmUgZmlsZS4KKwogLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgcG8ydGJsLnNlZCBmcm9tIGxyenN6LnBvdC4gICovCiAKICNpZiBIQVZFX0NPTkZJR19ICi0tLSBscnpzei0wLjEyLjIwLnNhZmUvcG8vZW5AYm9sZHF1b3QuaGVhZGVyCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL3BvL2VuQGJvbGRxdW90LmhlYWRlcgkyMDA0LTA5LTEyIDE0OjQwOjM0LjczMTY5MDkzNiAtMDQwMApAQCAtMCwwICsxLDI1IEBACisjIEFsbCB0aGlzIGNhdGFsb2cgInRyYW5zbGF0ZXMiIGFyZSBxdW90YXRpb24gY2hhcmFjdGVycy4KKyMgVGhlIG1zZ2lkcyBtdXN0IGJlIEFTQ0lJIGFuZCB0aGVyZWZvcmUgY2Fubm90IGNvbnRhaW4gcmVhbCBxdW90YXRpb24KKyMgY2hhcmFjdGVycywgb25seSBzdWJzdGl0dXRlcyBsaWtlIGdyYXZlIGFjY2VudCAoMHg2MCksIGFwb3N0cm9waGUgKDB4MjcpCisjIGFuZCBkb3VibGUgcXVvdGUgKDB4MjIpLiBUaGVzZSBzdWJzdGl0dXRlcyBsb29rIHN0cmFuZ2U7IHNlZQorIyBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3F1b3Rlcy5odG1sCisjCisjIFRoaXMgY2F0YWxvZyB0cmFuc2xhdGVzIGdyYXZlIGFjY2VudCAoMHg2MCkgYW5kIGFwb3N0cm9waGUgKDB4MjcpIHRvCisjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTgpIGFuZCByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOSkuCisjIEl0IGFsc28gdHJhbnNsYXRlcyBwYWlycyBvZiBhcG9zdHJvcGhlICgweDI3KSB0bworIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpCisjIGFuZCBwYWlycyBvZiBxdW90YXRpb24gbWFyayAoMHgyMikgdG8KKyMgbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxQykgYW5kIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyayAoVSsyMDFEKS4KKyMKKyMgV2hlbiBvdXRwdXQgdG8gYW4gVVRGLTggdGVybWluYWwsIHRoZSBxdW90YXRpb24gY2hhcmFjdGVycyBhcHBlYXIgcGVyZmVjdGx5LgorIyBXaGVuIG91dHB1dCB0byBhbiBJU08tODg1OS0xIHRlcm1pbmFsLCB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMgKGJ5IGljb252IGluIGdsaWJjIDIuMiBvciBuZXdlcikgb3IgdG8KKyMgZ3JhdmUvYWN1dGUgYWNjZW50IChieSBsaWJpY29udiksIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KKyMgV2hlbiBvdXRwdXQgdG8gYW4gQVNDSUkgdGVybWluYWwsIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byBhcG9zdHJvcGhlcywgYW5kIHRoZSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGFyZQorIyB0cmFuc2xpdGVyYXRlZCB0byAweDIyLgorIworIyBUaGlzIGNhdGFsb2cgZnVydGhlcm1vcmUgZGlzcGxheXMgdGhlIHRleHQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIG1hcmtzIGluCisjIGJvbGQgZmFjZSwgYXNzdW1pbmcgdGhlIFZUMTAwL1hUZXJtIGVzY2FwZSBzZXF1ZW5jZXMuCisjCi0tLSBscnpzei0wLjEyLjIwLnNhZmUvcG8vZW5AcXVvdC5oZWFkZXIJMTk2OS0xMi0zMSAxOTowMDowMC4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvcG8vZW5AcXVvdC5oZWFkZXIJMjAwNC0wOS0xMiAxNDo0MDozNC43Mzc2OTAwMjQgLTA0MDAKQEAgLTAsMCArMSwyMiBAQAorIyBBbGwgdGhpcyBjYXRhbG9nICJ0cmFuc2xhdGVzIiBhcmUgcXVvdGF0aW9uIGNoYXJhY3RlcnMuCisjIFRoZSBtc2dpZHMgbXVzdCBiZSBBU0NJSSBhbmQgdGhlcmVmb3JlIGNhbm5vdCBjb250YWluIHJlYWwgcXVvdGF0aW9uCisjIGNoYXJhY3RlcnMsIG9ubHkgc3Vic3RpdHV0ZXMgbGlrZSBncmF2ZSBhY2NlbnQgKDB4NjApLCBhcG9zdHJvcGhlICgweDI3KQorIyBhbmQgZG91YmxlIHF1b3RlICgweDIyKS4gVGhlc2Ugc3Vic3RpdHV0ZXMgbG9vayBzdHJhbmdlOyBzZWUKKyMgaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3Vjcy9xdW90ZXMuaHRtbAorIworIyBUaGlzIGNhdGFsb2cgdHJhbnNsYXRlcyBncmF2ZSBhY2NlbnQgKDB4NjApIGFuZCBhcG9zdHJvcGhlICgweDI3KSB0bworIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE4KSBhbmQgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIChVKzIwMTkpLgorIyBJdCBhbHNvIHRyYW5zbGF0ZXMgcGFpcnMgb2YgYXBvc3Ryb3BoZSAoMHgyNykgdG8KKyMgbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxOCkgYW5kIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyayAoVSsyMDE5KQorIyBhbmQgcGFpcnMgb2YgcXVvdGF0aW9uIG1hcmsgKDB4MjIpIHRvCisjIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIChVKzIwMUMpIGFuZCByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgKFUrMjAxRCkuCisjCisjIFdoZW4gb3V0cHV0IHRvIGFuIFVURi04IHRlcm1pbmFsLCB0aGUgcXVvdGF0aW9uIGNoYXJhY3RlcnMgYXBwZWFyIHBlcmZlY3RseS4KKyMgV2hlbiBvdXRwdXQgdG8gYW4gSVNPLTg4NTktMSB0ZXJtaW5hbCwgdGhlIHNpbmdsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIGFwb3N0cm9waGVzIChieSBpY29udiBpbiBnbGliYyAyLjIgb3IgbmV3ZXIpIG9yIHRvCisjIGdyYXZlL2FjdXRlIGFjY2VudCAoYnkgbGliaWNvbnYpLCBhbmQgdGhlIGRvdWJsZSBxdW90YXRpb24gbWFya3MgYXJlCisjIHRyYW5zbGl0ZXJhdGVkIHRvIDB4MjIuCisjIFdoZW4gb3V0cHV0IHRvIGFuIEFTQ0lJIHRlcm1pbmFsLCB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gYXBvc3Ryb3BoZXMsIGFuZCB0aGUgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBhcmUKKyMgdHJhbnNsaXRlcmF0ZWQgdG8gMHgyMi4KKyMKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9pbnNlcnQtaGVhZGVyLnNpbgkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9wby9pbnNlcnQtaGVhZGVyLnNpbgkyMDA0LTA5LTEyIDE0OjQwOjM0Ljc0MzY4OTExMiAtMDQwMApAQCAtMCwwICsxLDIzIEBACisjIFNlZCBzY3JpcHQgdGhhdCBpbnNlcnRzIHRoZSBmaWxlIGNhbGxlZCBIRUFERVIgYmVmb3JlIHRoZSBoZWFkZXIgZW50cnkuCisjCisjIEF0IGVhY2ggb2NjdXJyZW5jZSBvZiBhIGxpbmUgc3RhcnRpbmcgd2l0aCAibXNnaWQgIiwgd2UgZXhlY3V0ZSB0aGUgZm9sbG93aW5nCisjIGNvbW1hbmRzLiBBdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSwgaW5zZXJ0IHRoZSBmaWxlLiBBdCB0aGUgZm9sbG93aW5nCisjIG9jY3VycmVuY2VzLCBkbyBub3RoaW5nLiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBmb2xsb3dpbmcKKyMgb2NjdXJyZW5jZXMgaXMgYWNoaWV2ZWQgYnkgbG9va2luZyBhdCB0aGUgaG9sZCBzcGFjZS4KKy9ebXNnaWQgL3sKK3gKKyMgVGVzdCBpZiB0aGUgaG9sZCBzcGFjZSBpcyBlbXB0eS4KK3MvbS9tLwordGEKKyMgWWVzIGl0IHdhcyBlbXB0eS4gRmlyc3Qgb2NjdXJyZW5jZS4gUmVhZCB0aGUgZmlsZS4KK3IgSEVBREVSCisjIE91dHB1dCB0aGUgZmlsZSdzIGNvbnRlbnRzIGJ5IHJlYWRpbmcgdGhlIG5leHQgbGluZS4gQnV0IGRvbid0IGxvc2UgdGhlCisjIGN1cnJlbnQgbGluZSB3aGlsZSBkb2luZyB0aGlzLgorZworTgorYmIKKzphCisjIFRoZSBob2xkIHNwYWNlIHdhcyBub25lbXB0eS4gRm9sbG93aW5nIG9jY3VycmVuY2VzLiBEbyBub3RoaW5nLgoreAorOmIKK30KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9NYWtldmFycwkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9wby9NYWtldmFycwkyMDA0LTA5LTEyIDE0OjQwOjM0Ljc0ODY4ODM1MiAtMDQwMApAQCAtMCwwICsxLDQxIEBACisjIE1ha2VmaWxlIHZhcmlhYmxlcyBmb3IgUE8gZGlyZWN0b3J5IGluIGFueSBwYWNrYWdlIHVzaW5nIEdOVSBnZXR0ZXh0LgorCisjIFVzdWFsbHkgdGhlIG1lc3NhZ2UgZG9tYWluIGlzIHRoZSBzYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUuCitET01BSU4gPSAkKFBBQ0tBR0UpCisKKyMgVGhlc2UgdHdvIHZhcmlhYmxlcyBkZXBlbmQgb24gdGhlIGxvY2F0aW9uIG9mIHRoaXMgZGlyZWN0b3J5Lgorc3ViZGlyID0gcG8KK3RvcF9idWlsZGRpciA9IC4uCisKKyMgVGhlc2Ugb3B0aW9ucyBnZXQgcGFzc2VkIHRvIHhnZXR0ZXh0LgorWEdFVFRFWFRfT1BUSU9OUyA9IC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXworCisjIFRoaXMgaXMgdGhlIGNvcHlyaWdodCBob2xkZXIgdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGhlYWRlciBvZiB0aGUKKyMgJChET01BSU4pLnBvdCBmaWxlLiAgU2V0IHRoaXMgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHN1cnJvdW5kaW5nCisjIHBhY2thZ2UuICAoTm90ZSB0aGF0IHRoZSBtc2dzdHIgc3RyaW5ncywgZXh0cmFjdGVkIGZyb20gdGhlIHBhY2thZ2UncworIyBzb3VyY2VzLCBiZWxvbmcgdG8gdGhlIGNvcHlyaWdodCBob2xkZXIgb2YgdGhlIHBhY2thZ2UuKSAgVHJhbnNsYXRvcnMgYXJlCisjIGV4cGVjdGVkIHRvIHRyYW5zZmVyIHRoZSBjb3B5cmlnaHQgZm9yIHRoZWlyIHRyYW5zbGF0aW9ucyB0byB0aGlzIHBlcnNvbgorIyBvciBlbnRpdHksIG9yIHRvIGRpc2NsYWltIHRoZWlyIGNvcHlyaWdodC4gIFRoZSBlbXB0eSBzdHJpbmcgc3RhbmRzIGZvcgorIyB0aGUgcHVibGljIGRvbWFpbjsgaW4gdGhpcyBjYXNlIHRoZSB0cmFuc2xhdG9ycyBhcmUgZXhwZWN0ZWQgdG8gZGlzY2xhaW0KKyMgdGhlaXIgY29weXJpZ2h0LgorQ09QWVJJR0hUX0hPTERFUiA9IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgaXMgdGhlIGVtYWlsIGFkZHJlc3Mgb3IgVVJMIHRvIHdoaWNoIHRoZSB0cmFuc2xhdG9ycyBzaGFsbCByZXBvcnQKKyMgYnVncyBpbiB0aGUgdW50cmFuc2xhdGVkIHN0cmluZ3M6CisjIC0gU3RyaW5ncyB3aGljaCBhcmUgbm90IGVudGlyZSBzZW50ZW5jZXMsIHNlZSB0aGUgbWFpbnRhaW5lciBndWlkZWxpbmVzCisjICAgaW4gdGhlIEdOVSBnZXR0ZXh0IGRvY3VtZW50YXRpb24sIHNlY3Rpb24gJ1ByZXBhcmluZyBTdHJpbmdzJy4KKyMgLSBTdHJpbmdzIHdoaWNoIHVzZSB1bmNsZWFyIHRlcm1zIG9yIHJlcXVpcmUgYWRkaXRpb25hbCBjb250ZXh0IHRvIGJlCisjICAgdW5kZXJzdG9vZC4KKyMgLSBTdHJpbmdzIHdoaWNoIG1ha2UgaW52YWxpZCBhc3N1bXB0aW9ucyBhYm91dCBub3RhdGlvbiBvZiBkYXRlLCB0aW1lIG9yCisjICAgbW9uZXkuCisjIC0gUGx1cmFsaXNhdGlvbiBwcm9ibGVtcy4KKyMgLSBJbmNvcnJlY3QgRW5nbGlzaCBzcGVsbGluZy4KKyMgLSBJbmNvcnJlY3QgZm9ybWF0dGluZy4KKyMgSXQgY2FuIGJlIHlvdXIgZW1haWwgYWRkcmVzcywgb3IgYSBtYWlsaW5nIGxpc3QgYWRkcmVzcyB3aGVyZSB0cmFuc2xhdG9ycworIyBjYW4gd3JpdGUgdG8gd2l0aG91dCBiZWluZyBzdWJzY3JpYmVkLCBvciB0aGUgVVJMIG9mIGEgd2ViIHBhZ2UgdGhyb3VnaAorIyB3aGljaCB0aGUgdHJhbnNsYXRvcnMgY2FuIGNvbnRhY3QgeW91LgorTVNHSURfQlVHU19BRERSRVNTID0KKworIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGxvY2FsZSBjYXRlZ29yaWVzLCBiZXlvbmQgTENfTUVTU0FHRVMsIGZvciB3aGljaCB0aGUKKyMgbWVzc2FnZSBjYXRhbG9ncyBzaGFsbCBiZSB1c2VkLiAgSXQgaXMgdXN1YWxseSBlbXB0eS4KK0VYVFJBX0xPQ0FMRV9DQVRFR09SSUVTID0KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9xdW90LnNlZAkxOTY5LTEyLTMxIDE5OjAwOjAwLjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9wby9xdW90LnNlZAkyMDA0LTA5LTEyIDE0OjQwOjM0Ljc1NDY4NzQ0MCAtMDQwMApAQCAtMCwwICsxLDYgQEAKK3MvIlwoW14iXSpcKSIv4oCcXDHigJ0vZworcy9gXChbXmAnXSpcKScv4oCYXDHigJkvZworcy8gJ1woW15gJ10qXCknIC8g4oCYXDHigJkgL2cKK3MvICdcKFteYCddKlwpJyQvIOKAmFwx4oCZL2cKK3MvXidcKFteYCddKlwpJyAv4oCYXDHigJkgL2cKK3Mv4oCc4oCdLyIiL2cKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9yZW1vdmUtcG90Y2RhdGUuc2luCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL3BvL3JlbW92ZS1wb3RjZGF0ZS5zaW4JMjAwNC0wOS0xMiAxNDo0MDozNC43NjI2ODYyMjQgLTA0MDAKQEAgLTAsMCArMSwxOSBAQAorIyBTZWQgc2NyaXB0IHRoYXQgcmVtb3ZlIHRoZSBQT1QtQ3JlYXRpb24tRGF0ZSBsaW5lIGluIHRoZSBoZWFkZXIgZW50cnkKKyMgZnJvbSBhIFBPVCBmaWxlLgorIworIyBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHRoZSBmb2xsb3dpbmcgb2NjdXJyZW5jZXMgb2YgdGhlCisjIHBhdHRlcm4gaXMgYWNoaWV2ZWQgYnkgbG9va2luZyBhdCB0aGUgaG9sZCBzcGFjZS4KKy9eIlBPVC1DcmVhdGlvbi1EYXRlOiAuKiIkL3sKK3gKKyMgVGVzdCBpZiB0aGUgaG9sZCBzcGFjZSBpcyBlbXB0eS4KK3MvUC9QLwordGEKKyMgWWVzIGl0IHdhcyBlbXB0eS4gRmlyc3Qgb2NjdXJyZW5jZS4gUmVtb3ZlIHRoZSBsaW5lLgorZworZAorYmIKKzphCisjIFRoZSBob2xkIHNwYWNlIHdhcyBub25lbXB0eS4gRm9sbG93aW5nIG9jY3VycmVuY2VzLiBEbyBub3RoaW5nLgoreAorOmIKK30KLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9SdWxlcy1xdW90CTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCisrKyBscnpzei0wLjEyLjIwL3BvL1J1bGVzLXF1b3QJMjAwNC0wOS0xMiAxNDo0MDozNC43Nzg2ODM3OTIgLTA0MDAKQEAgLTAsMCArMSw0NyBAQAorIyBTcGVjaWFsIE1ha2VmaWxlIHJ1bGVzIGZvciBFbmdsaXNoIG1lc3NhZ2UgY2F0YWxvZ3Mgd2l0aCBxdW90YXRpb24gbWFya3MuCisKK0RJU1RGSUxFUy5jb21tb24uZXh0cmExID0gcXVvdC5zZWQgYm9sZHF1b3Quc2VkIGVuQHF1b3QuaGVhZGVyIGVuQGJvbGRxdW90LmhlYWRlciBpbnNlcnQtaGVhZGVyLnNpbiBSdWxlcy1xdW90CisKKy5TVUZGSVhFUzogLmluc2VydC1oZWFkZXIgLnBvLXVwZGF0ZS1lbgorCitlbkBxdW90LnBvLWNyZWF0ZToKKwkkKE1BS0UpIGVuQHF1b3QucG8tdXBkYXRlCitlbkBib2xkcXVvdC5wby1jcmVhdGU6CisJJChNQUtFKSBlbkBib2xkcXVvdC5wby11cGRhdGUKKworZW5AcXVvdC5wby11cGRhdGU6IGVuQHF1b3QucG8tdXBkYXRlLWVuCitlbkBib2xkcXVvdC5wby11cGRhdGU6IGVuQGJvbGRxdW90LnBvLXVwZGF0ZS1lbgorCisuaW5zZXJ0LWhlYWRlci5wby11cGRhdGUtZW46CisJQGxhbmc9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXC5wby11cGRhdGUtZW4kJC8vJ2A7IFwKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IEdFVFRFWFRMSUJESVI9YGNkICQodG9wX3NyY2Rpcikvc3JjICYmIHB3ZGA7IGV4cG9ydCBHRVRURVhUTElCRElSOyBmaTsgXAorCXRtcGRpcj1gcHdkYDsgXAorCWVjaG8gIiQkbGFuZzoiOyBcCisJbGw9YGVjaG8gJCRsYW5nIHwgc2VkIC1lICdzL0AuKi8vJ2A7IFwKKwlMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgXAorCWNkICQoc3JjZGlyKTsgXAorCWlmICQoTVNHSU5JVCkgLWkgJChET01BSU4pLnBvdCAtLW5vLXRyYW5zbGF0b3IgLWwgJCRsbCAtbyAtIDI+L2Rldi9udWxsIHwgc2VkIC1mICQkdG1wZGlyLyQkbGFuZy5pbnNlcnQtaGVhZGVyIHwgJChNU0dDT05WKSAtdCBVVEYtOCB8ICQoTVNHRklMVEVSKSBzZWQgLWYgYGVjaG8gJCRsYW5nIHwgc2VkIC1lICdzLy4qQC8vJ2Auc2VkIDI+L2Rldi9udWxsID4gJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgdGhlbiBcCisJICBpZiBjbXAgJCRsYW5nLnBvICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICAgcm0gLWYgJCR0bXBkaXIvJCRsYW5nLm5ldy5wbzsgXAorCSAgZWxzZSBcCisJICAgIGlmIG12IC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gJCRsYW5nLnBvOyB0aGVuIFwKKwkgICAgICA6OyBcCisJICAgIGVsc2UgXAorCSAgICAgIGVjaG8gImNyZWF0aW9uIG9mICQkbGFuZy5wbyBmYWlsZWQ6IGNhbm5vdCBtb3ZlICQkdG1wZGlyLyQkbGFuZy5uZXcucG8gdG8gJCRsYW5nLnBvIiAxPiYyOyBcCisJICAgICAgZXhpdCAxOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCWVsc2UgXAorCSAgZWNobyAiY3JlYXRpb24gb2YgJCRsYW5nLnBvIGZhaWxlZCEiIDE+JjI7IFwKKwkgIHJtIC1mICQkdG1wZGlyLyQkbGFuZy5uZXcucG87IFwKKwlmaQorCitlbkBxdW90Lmluc2VydC1oZWFkZXI6IGluc2VydC1oZWFkZXIuc2luCisJc2VkIC1lICcvXiMvZCcgLWUgJ3MvSEVBREVSL2VuQHF1b3QuaGVhZGVyL2cnICQoc3JjZGlyKS9pbnNlcnQtaGVhZGVyLnNpbiA+IGVuQHF1b3QuaW5zZXJ0LWhlYWRlcgorCitlbkBib2xkcXVvdC5pbnNlcnQtaGVhZGVyOiBpbnNlcnQtaGVhZGVyLnNpbgorCXNlZCAtZSAnL14jL2QnIC1lICdzL0hFQURFUi9lbkBib2xkcXVvdC5oZWFkZXIvZycgJChzcmNkaXIpL2luc2VydC1oZWFkZXIuc2luID4gZW5AYm9sZHF1b3QuaW5zZXJ0LWhlYWRlcgorCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcXVvdAorbW9zdGx5Y2xlYW4tcXVvdDoKKwlybSAtZiAqLmluc2VydC1oZWFkZXIKLS0tIGxyenN6LTAuMTIuMjAuc2FmZS9wby9zdGFtcC1jYXQtaWQJMTk5OC0xMi0zMCAwMjo1MDowMS4wMDAwMDAwMDAgLTA1MDAKKysrIGxyenN6LTAuMTIuMjAvcG8vc3RhbXAtY2F0LWlkCTE5NjktMTItMzEgMTk6MDA6MDAuMDAwMDAwMDAwIC0wNTAwCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcAotLS0gbHJ6c3otMC4xMi4yMC5zYWZlL3NyYy9NYWtlZmlsZS5hbQkxOTk4LTEyLTI4IDAzOjM4OjQ3LjAwMDAwMDAwMCAtMDUwMAorKysgbHJ6c3otMC4xMi4yMC9zcmMvTWFrZWZpbGUuYW0JMjAwNC0wOS0xMiAxNDo0MDo1My42NjU4MTI1MTIgLTA0MDAKQEAgLTIsMTIgKzIsMTIgQEAKIGxyel9TT1VSQ0VTPWxyei5jIHRpbWluZy5jIHpwZXJyLmMgenJlYWRsaW5lLmMgY3JjdGFiLmMgcmJzYi5jIHptLmMgcHJvdG5hbWUuYyB0Y3AuYyBsc3lzbG9nLmMgY2FuaXQuYwogbHN6X1NPVVJDRVM9bHN6LmMgdGltaW5nLmMgenBlcnIuYyB6cmVhZGxpbmUuYyBjcmN0YWIuYyByYnNiLmMgem0uYyBwcm90bmFtZS5jIHRjcC5jIGxzeXNsb2cuYyBjYW5pdC5jCiBub2luc3RfSEVBREVSUyA9IHRpbWluZy5oIHpnbG9iYWwuaCB6bW9kZW0uaAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACitkYXRhZGlyID0gJChwcmVmaXgpL3NoYXJlCiBsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQogQ0ZMQUdTPUBDRkxBR1NACiBESVNUQ0xFQU5fRklMRVM9bHJ6c3pidWcKIAotTERBREQgPSAuLi9saWIvbGliem1vZGVtLmEgQElOVExMSUJTQAorTERBREQgPSAuLi9saWIvbGliem1vZGVtLmEgQExJQklOVExACiBBVVRPTUFLRV9PUFRJT05TPWFuc2kya25yCiBFWFRSQV9ESVNUID0gYW5zaTJrbnIuMSBhbnNpMmtuci5jIGxyenN6YnVnLmluCiBJTkNMVURFUyA9IC1JLi4gLUkkKHNyY2RpcikgLUkkKHRvcF9zcmNkaXIpL3NyYyAtSS4uL2ludGwgLUkkKHRvcF9zcmNkaXIpL2xpYgo=